1、CC2541蓝牙4.0芯片中级教程——基于OSAL操作系统的运行流程了解+定时器和串口例程了解
2015-08-29 21:36
375 查看
本文根据一周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 从机广播功率修改
[b]1、基本流程初探[/b]
OSAL 的英文全名称叫做 “OS Abstraction Layer ”,操作系统,诞生于 TI 发布 zigbee 系列芯片时期,10年历史
系统基本运行流程:
>> main函数中是基本的系统初始化,然后进入
osal_start_system();
大循环,不断检测标志位,根据不同标志位来执行不同任务
后面看该大循环-->
>> 负责任务遍历(也就是如何调度事务了)~
osal_start_system();中一直循环执行osal_run_system( void ):遍历所有事件,发现一个就执行该事件,没有事件则休眠
>> 初始化的流程
osal_init_system();---->
osalInitTasks();//初始化系统任务, 这一个任务初始化非常关键---->
SimpleBLETest_Init( taskID ); //这个就是我们的应用程序初始化---->
osal_set_event( SimpleBLETest_TaskID, SBP_START_DEVICE_EVT );//因为采用多任务,
所以调用该函数设置一个任务该函数内部也比较简单,就是维护一个标志位数组:tasksEvents[task_id] |= event_flag;
[b]2、[b]OSAL系统基本流程进一步了解[/b][/b]
[b][b]2.1、定时器例程[/b][/b]
定时器有用函数:(OSAL_Timers.c)
![](http://images2015.cnblogs.com/blog/506370/201508/506370-20150829211644547-1702988697.png)
LED有用函数:(hal_led.c.c)
![](http://images2015.cnblogs.com/blog/506370/201508/506370-20150829211729812-230484978.png)
上一节说到沿着初始化函数一直进入会到任务设置部分:
![](http://images2015.cnblogs.com/blog/506370/201508/506370-20150829212056109-543397203.png)
而这里设置好之后,一旦有相应的消息过来就会最终触发应用层的:
![](http://images2015.cnblogs.com/blog/506370/201508/506370-20150829212221453-1870060293.png)
至于为什么这样,先不说~
其余例程流程基本都是这样!
[b]2.2、串口例程[/b]
![](http://images2015.cnblogs.com/blog/506370/201508/506370-20150829212501547-145480037.png)
串口初始化的时候采用回调函数,类似于C#,因此数据接收在回调函数中处理~
![](http://images2015.cnblogs.com/blog/506370/201508/506370-20150829212602781-499787674.png)
上面95行,串口初始化函数的形参是串口接收的回调函数---->具体如下:
![](http://images2015.cnblogs.com/blog/506370/201508/506370-20150829212724953-347962171.png)
上面是串口接收(利用回调),其发送比较简单,调用函数即可:
串口发送函数有多种:
![](http://images2015.cnblogs.com/blog/506370/201508/506370-20150829213002812-797404868.png)
未完~关注我的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 从机广播功率修改
[b]1、基本流程初探[/b]
OSAL 的英文全名称叫做 “OS Abstraction Layer ”,操作系统,诞生于 TI 发布 zigbee 系列芯片时期,10年历史
系统基本运行流程:
>> main函数中是基本的系统初始化,然后进入
osal_start_system();
大循环,不断检测标志位,根据不同标志位来执行不同任务
后面看该大循环-->
int main(void) { /* Initialize hardware */ HAL_BOARD_INIT(); //初始化时钟稳定时钟等等 // Initialize board I/O //冷启动,关闭了led灯与中断, 一边接下来的各种初始化不受干扰 InitBoard( OB_COLD ); /* Initialze the HAL driver */ HalDriverInit(); //各种驱动的初始化、如按键、lcd、adc、usb、uart等 /* Initialize NV system */ //snv 内部用于保存配对数据或你的用户自定义数据的一段flash,4kB空间 osal_snv_init(); /* Initialize LL */ /* Initialize the operating system */ //oasl 操作系统初始化, 包含内存分配、消息队列、定时器、电源管理和任务等 21 osal_init_system(); /* Enable interrupts */ HAL_ENABLE_INTERRUPTS();// 开启全局中断 // Final board initialization InitBoard( OB_READY ); //设置标志标示系统初始化完毕 #if defined ( POWER_SAVING ) // 如果你使能了低功耗, 就启动低功耗模式, osal_pwrmgr_device( PWRMGR_BATTERY ); #endif /* 低功耗部分 1.如何总是在PM1 osal_pwrmgr_device( PWRMGR_ALWAYS_ON ); 2.如何进入PM2 osal_pwrmgr_device( PWRMGR_BATTERY );在空闲的时候就会进入到PM2模式 3.如何进入PM3 存在连接就断开连接,存在广播就停掉广播,并确认自己创建的所有定时任务都已关闭, 则系统应该就会进入PM3模式,只能进行外部中断唤醒 */ /* Start OSAL */ osal_start_system(); // No Return from here 46 /* osal 操作系统启动,实际上是一个大循环,只是检查相对应的标志位, 47 就指定相对应的任务,看到这里,同学们应该往哪里看呢?其实,这已经是尽头了?那么我们的应用程序是在哪里写的呢 48 其实是在上面的 上面的函数 osal_init_system 里就初始化了,现在回过头去看看 osal_init_system 这个函数内部就知道了 */ return 0; }
>> 负责任务遍历(也就是如何调度事务了)~
osal_start_system();中一直循环执行osal_run_system( void ):遍历所有事件,发现一个就执行该事件,没有事件则休眠
>> 初始化的流程
osal_init_system();---->
osalInitTasks();//初始化系统任务, 这一个任务初始化非常关键---->
SimpleBLETest_Init( taskID ); //这个就是我们的应用程序初始化---->
void SimpleBLETest_Init( uint8 task_id ) { //保存任务id到全局变量 SimpleBLETest_TaskID = task_id; //lcd 显示 HalLcdWriteString( "SimpleBLETest 2", HAL_LCD_LINE_1 ); // Setup a delayed profile startup /* 11 设置一个任务, 这么做的目的是按照多任务处理的方法来做 12 SimpleBLETest_ProcessEvent 就是处理 SBP_START_DEVICE_EVT 13 */ 14 osal_set_event( SimpleBLETest_TaskID, SBP_START_DEVICE_EVT ); }
osal_set_event( SimpleBLETest_TaskID, SBP_START_DEVICE_EVT );//因为采用多任务,
所以调用该函数设置一个任务该函数内部也比较简单,就是维护一个标志位数组:tasksEvents[task_id] |= event_flag;
uint8 osal_set_event( uint8 task_id, uint16 event_flag ) { if ( task_id < tasksCnt ) { halIntState_t intState; HAL_ENTER_CRITICAL_SECTION(intState); // Hold off interrupts tasksEvents[task_id] |= event_flag; // Stuff the event bit(s) HAL_EXIT_CRITICAL_SECTION(intState); // Release interrupts return ( SUCCESS ); } else { return ( INVALID_TASK ); } }
[b]2、[b]OSAL系统基本流程进一步了解[/b][/b]
[b][b]2.1、定时器例程[/b][/b]
定时器有用函数:(OSAL_Timers.c)
![](http://images2015.cnblogs.com/blog/506370/201508/506370-20150829211644547-1702988697.png)
LED有用函数:(hal_led.c.c)
![](http://images2015.cnblogs.com/blog/506370/201508/506370-20150829211729812-230484978.png)
上一节说到沿着初始化函数一直进入会到任务设置部分:
![](http://images2015.cnblogs.com/blog/506370/201508/506370-20150829212056109-543397203.png)
而这里设置好之后,一旦有相应的消息过来就会最终触发应用层的:
![](http://images2015.cnblogs.com/blog/506370/201508/506370-20150829212221453-1870060293.png)
至于为什么这样,先不说~
其余例程流程基本都是这样!
[b]2.2、串口例程[/b]
![](http://images2015.cnblogs.com/blog/506370/201508/506370-20150829212501547-145480037.png)
串口初始化的时候采用回调函数,类似于C#,因此数据接收在回调函数中处理~
![](http://images2015.cnblogs.com/blog/506370/201508/506370-20150829212602781-499787674.png)
上面95行,串口初始化函数的形参是串口接收的回调函数---->具体如下:
![](http://images2015.cnblogs.com/blog/506370/201508/506370-20150829212724953-347962171.png)
上面是串口接收(利用回调),其发送比较简单,调用函数即可:
串口发送函数有多种:
![](http://images2015.cnblogs.com/blog/506370/201508/506370-20150829213002812-797404868.png)
未完~关注我的cc2541分类
相关文章推荐
- MVC学习笔记---MVC生命周期
- Python文件读写
- 网络流习题
- inotify-tools、sersync配置及压力测试
- Altium Designer官方库下载地址(自己知道芯片公司的话这里很方便)
- 项目1------智慧北京
- 数组参数传递时需要注意的事项
- SQL基本语法(笔记)
- Linux sort 命令
- 腾讯在线模拟笔试-2016涉及知识点
- LeetCode Ugly Number
- muduo网络库源码学习————线程特定数据
- 了解 JavaScript (3)- 马上开始
- Android Studio plugins recommend
- php大力力 [036节] 后台系统的登录页面界面做完啦
- Hadoop中两表JOIN的处理方法(转)
- 初来咋到~~~
- 懒加载的坑
- 内网渗透浅析
- 【english】1508 The Great Augus