1、CC2541蓝牙4.0芯片中级教程——基于OSAL操作系统的运行流程了解+定时器和串口例程了解

简介:


 

 

本文根据一周CC2541笔记汇总得来——

适合概览和知识快速索引——

全部链接:

中级教程-OSAL操作系统\OSAL操作系统-实验01 OSAL初探

【插入】SourceInsight-工程建立方法

中级教程-OSAL操作系统(OSAL系统解基本套路)

中级教程-OSAL操作系统(进一步了解-OLED && 普通按键和5方向按键-中断!!!)这个系统驱动层和应用层不一样~

中级教程-OSAL操作系统(ADC-光敏电阻)

OSAL操作系统-实验16 串口波特率扩展

OSAL操作系统-实验17 AT命令初步

OSAL操作系统-实验20 模拟IIC通信+硬件IIC(Mpu6050)

OSAL 操作系统-实验 23 PWM 输出(改变占空比)

OSAL 操作系统-实验 24 看门狗 WachDog

OSAL操作系统-实验25 SNV内部Flash数据读写

OSAL 操作系统-实验 29 系统睡眠等级研究

OSAL 操作系统-实验 31 从机广播功率修改

 

1、基本流程初探

OSAL 的英文全名称叫做 “OS Abstraction Layer ”,操作系统,诞生于 TI 发布 zigbee 系列芯片时期,10年历史

系统基本运行流程:

>> main函数中是基本的系统初始化,然后进入

osal_start_system(); 
大循环,不断检测标志位,根据不同标志位来执行不同任务
后面看该大循环-->

复制代码
 1 int main(void)
 2 {
 3     /* Initialize hardware */
 4     HAL_BOARD_INIT();      //初始化时钟稳定时钟等等
 5 
 6     // Initialize board I/O
 7     //冷启动,关闭了led灯与中断, 一边接下来的各种初始化不受干扰
 8     InitBoard( OB_COLD );
 9 
10     /* Initialze the HAL driver */
11     HalDriverInit();   //各种驱动的初始化、如按键、lcd、adc、usb、uart等
12 
13     /* Initialize NV system */
14     //snv 内部用于保存配对数据或你的用户自定义数据的一段flash,4kB空间
15     osal_snv_init();
16 
17     /* Initialize LL */
18 
19     /* Initialize the operating system */
20     //oasl 操作系统初始化, 包含内存分配、消息队列、定时器、电源管理和任务等
21   osal_init_system();
22 
23     /* Enable interrupts */
24     HAL_ENABLE_INTERRUPTS();// 开启全局中断
25 
26     // Final board initialization
27     InitBoard( OB_READY );      //设置标志标示系统初始化完毕
28 
29 #if defined ( POWER_SAVING )
30     // 如果你使能了低功耗, 就启动低功耗模式,
31     osal_pwrmgr_device( PWRMGR_BATTERY );
32 #endif
33     /*
34     低功耗部分
35     1.如何总是在PM1
36       osal_pwrmgr_device( PWRMGR_ALWAYS_ON );
37     2.如何进入PM2
38       osal_pwrmgr_device( PWRMGR_BATTERY );在空闲的时候就会进入到PM2模式
39     3.如何进入PM3
40       存在连接就断开连接,存在广播就停掉广播,并确认自己创建的所有定时任务都已关闭,
41       则系统应该就会进入PM3模式,只能进行外部中断唤醒
42     */
43 
44     /* Start OSAL */
45     osal_start_system(); // No Return from here
46     /* osal 操作系统启动,实际上是一个大循环,只是检查相对应的标志位,
47     就指定相对应的任务,看到这里,同学们应该往哪里看呢?其实,这已经是尽头了?那么我们的应用程序是在哪里写的呢
48     其实是在上面的 上面的函数 osal_init_system 里就初始化了,现在回过头去看看
49     osal_init_system 这个函数内部就知道了
50     */
51     return 0;
52 }
复制代码
>> 负责任务遍历(也就是如何调度事务了)~

osal_start_system();中一直循环执行osal_run_system( void ):遍历所有事件,发现一个就执行该事件,没有事件则休眠

 

>> 初始化的流程

osal_init_system();---->

osalInitTasks();//初始化系统任务, 这一个任务初始化非常关键---->

SimpleBLETest_Init( taskID );     //这个就是我们的应用程序初始化---->

复制代码
 1 void SimpleBLETest_Init( uint8 task_id )
 2 {
 3     //保存任务id到全局变量
 4     SimpleBLETest_TaskID = task_id;
 5 
 6     //lcd 显示
 7     HalLcdWriteString( "SimpleBLETest 2", HAL_LCD_LINE_1 );
 8 
 9     // Setup a delayed profile startup
10     /*
11     设置一个任务, 这么做的目的是按照多任务处理的方法来做
12     SimpleBLETest_ProcessEvent 就是处理 SBP_START_DEVICE_EVT
13     */
14     osal_set_event( SimpleBLETest_TaskID, SBP_START_DEVICE_EVT );
15 }
复制代码

osal_set_event( SimpleBLETest_TaskID, SBP_START_DEVICE_EVT );//因为采用多任务,

所以调用该函数设置一个任务该函数内部也比较简单,就是维护一个标志位数组:tasksEvents[task_id] |= event_flag; 

复制代码
 1 uint8 osal_set_event( uint8 task_id, uint16 event_flag )
 2 {
 3     if ( task_id < tasksCnt )
 4     {
 5         halIntState_t   intState;
 6         HAL_ENTER_CRITICAL_SECTION(intState);    // Hold off interrupts
 7         tasksEvents[task_id] |= event_flag;  // Stuff the event bit(s)
 8         HAL_EXIT_CRITICAL_SECTION(intState);     // Release interrupts
 9         return ( SUCCESS );
10     }
11     else
12     {
13         return ( INVALID_TASK );
14     }
15 }
复制代码

 

 

2、OSAL系统基本流程进一步了解

2.1、定时器例程

定时器有用函数:(OSAL_Timers.c)

 

LED有用函数:(hal_led.c.c)

 

上一节说到沿着初始化函数一直进入会到任务设置部分:

 

而这里设置好之后,一旦有相应的消息过来就会最终触发应用层的:

至于为什么这样,先不说~

其余例程流程基本都是这样!

 

2.2、串口例程

串口初始化的时候采用回调函数,类似于C#,因此数据接收在回调函数中处理~

 

上面95行,串口初始化函数的形参是串口接收的回调函数---->具体如下:

 

上面是串口接收(利用回调),其发送比较简单,调用函数即可:

串口发送函数有多种:

 

 



本文转自beautifulzzzz博客园博客,原文链接:http://www.cnblogs.com/zjutlitao/p/4769690.html,如需转载请自行联系原作者

 

相关文章
|
1月前
|
Ubuntu 开发工具
Ubuntu 22.04 aarch64版本操作系统下编译ZLMediaKit教程
通过上述步骤,你可以在Ubuntu 22.04 aarch64版本上成功编译ZLMediaKit,这是一个相对简单而直接的过程,但可能会遇到一些需要根据具体系统环境和要求调整的地方。
334 0
|
5月前
|
Python
Python教程:os 与 sys 模块详细用法
os 模块用于与操作系统交互,主要涉及夹操作、路径操作和其他操作。例如,`os.rename()` 重命名文件,`os.mkdir()` 创建文件夹,`os.path.abspath()` 获取文件绝对路径等。sys 模块则用于与 Python 解释器交互,常用功能如 `sys.path` 查看模块搜索路径,`sys.platform` 检测操作系统等。这些模块提供了丰富的工具,便于开发中处理系统和文件相关任务。
210 14
|
6月前
|
监控 关系型数据库 MySQL
zabbix7.0.9安装-以宝塔安装形式-非docker容器安装方法-系统采用AlmaLinux9系统-最佳匹配操作系统提供稳定运行环境-安装教程完整版本-优雅草卓伊凡
zabbix7.0.9安装-以宝塔安装形式-非docker容器安装方法-系统采用AlmaLinux9系统-最佳匹配操作系统提供稳定运行环境-安装教程完整版本-优雅草卓伊凡
352 30
|
11月前
|
存储 弹性计算 运维
阿里云国际Windows操作系统迁移教程
阿里云国际Windows操作系统迁移教程
|
7月前
|
Web App开发 安全 Linux
【独家揭秘2025】VMware Workstation Pro虚拟机:免费安装教程大放送,一键解锁操作系统模拟神器!
VMware Workstation Pro 是由威睿(VMware)公司开发的一款功能强大的桌面虚拟化软件,允许用户在同一台物理计算机上同时运行多个操作系统,如Windows、..
424 2
【独家揭秘2025】VMware Workstation Pro虚拟机:免费安装教程大放送,一键解锁操作系统模拟神器!
|
11月前
|
弹性计算 开发框架 .NET
阿里云服务器购买教程及云服务器地域、实例、操作系统、带宽等参数选择指南
对于初次购买阿里云服务器的用户来说,想使用阿里云服务器搭建网站或者运行APP、小程序等项目,第一步就是要先购买阿里云服务器,下面小编以图文形式给大家介绍一下阿里云服务器的购买流程,以及购买过程中如何云服务器地域、实例、带宽等关键配置和选择这些参数的一些注意事项,以供参考。
|
11月前
|
应用服务中间件 Linux nginx
Mac os 安装 nginx 教程(success)
这篇文章是关于如何在Mac OS系统上使用Homebrew安装nginx及其依赖,并解决安装过程中可能出现的权限问题。
1362 0
Mac os 安装 nginx 教程(success)
|
10月前
|
Web App开发 API Windows
取接口访问者信息[IP,浏览器,操作系统]免费API接口教程
此API用于获取访问者的IP地址、浏览器和操作系统信息,支持70多种浏览器和操作系统。通过POST或GET请求至`https://cn.apihz.cn/api/ip/getapi.php`,需提供用户ID和KEY。返回结果包括状态码、消息、IP、浏览器和操作系统信息。示例:{&quot;code&quot;:200,&quot;ip&quot;:&quot;175.154.88.178&quot;,&quot;browser&quot;:&quot;Chrome&quot;,&quot;os&quot;:&quot;Windows 10&quot;}。详情见官网文档。
|
Unix Shell Python
Python教程:开箱即用的Python os模块知识
注:文末有福利小工具源码 Python 的 os 模块提供了许多接口用于与操作系统进行交互,包括文件操作、目录操作、路径操作、环境变量操作、系统信息获取等
123 1
|
Linux 网络安全 数据安全/隐私保护
网络安全教程-------渗透工具Kali,官网链接,ARM的介绍,Mobil,华为小米,oppe手机,是无法刷入第三方的操作系统的,E+手机,谷歌的picksoul,或者三星手机,系统盘是WSL的
网络安全教程-------渗透工具Kali,官网链接,ARM的介绍,Mobil,华为小米,oppe手机,是无法刷入第三方的操作系统的,E+手机,谷歌的picksoul,或者三星手机,系统盘是WSL的

热门文章

最新文章

推荐镜像

更多