2039|0

3836

帖子

19

TA的资源

纯净的硅(中级)

楼主
 

CC2541迷你开发套件使用心得分享+osal上手by无聊达 [复制链接]

     在开始学习之前,推荐大家阅读《蓝牙4.0 BLE开发完全手册---物联网开发技术实战》这本书,这本书从基础讲起,确实对初学者很有用,初学者在论坛里逛了多久都没有用,因为你没有基础,甚至看不懂论坛里的人在讨论啥,只有看了了这本书,才能较快地入门osal开发。

 

OSAL为:Operating System Abstraction Layer,即操作系统抽象层,支持多任务运行,它并不是一个传统意义上的操作系统,但是实现了部分类似操作系统的功能,在多个协议栈中通用的任务调度和事件处理的操作系统抽象层,它不是完整的操作系统。可以直接运行,也可以运行在RTOS等操作系统进程中。不支持抢占时间片,任务优先级不可以调整,任务优先级决定于任务ID,任务ID越小,优先级越高,BLE协议栈各层的任务优先级比应用程序的高。

流程解析

首先我们找到主函数所在的文件

 

查看详情

 

接下来一个个分析红底函数

 

int main(void)

{

  /* Initialize hardware */

  HAL_BOARD_INIT();

 

  // Initialize board I/O

  InitBoard( OB_COLD );

 

  /* Initialze the HAL driver */

  HalDriverInit();

 

  /* Initialize NV system */

  osal_snv_init();

  

  /* Initialize LL */

 

  /* Initialize the operating system */

  osal_init_system();

 

  /* Enable interrupts */

  HAL_ENABLE_INTERRUPTS();

 

  // Final board initialization

  InitBoard( OB_READY );

 

  #if defined ( POWER_SAVING )

    osal_pwrmgr_device( PWRMGR_BATTERY );

  #endif

    

  /* Start OSAL */

  osal_start_system(); // No Return from here

 

  return 0;

}

 

 

  /* Initialize hardware */

  HAL_BOARD_INIT(); //HAL_BOARD_INIT()是通过宏定义来实现的,主要功能是初始化时钟等

 

查看详情

 

 

  // Initialize board I/O

  InitBoard( OB_COLD ); //初始化板外围设备

查看详情

 

 

 

/* Initialze the HAL driver */

  HalDriverInit(); //初始化定时器,adc,dma,lcd,led等

查看详情

 

 

 

  /* Initialize NV system */

  osal_snv_init(); //初始化NV flash页面。用于保存配对数据或你的用户自定义数据的一段flash,4kB空间

查看详情

 

 

  /* Initialize the operating system */

  osal_init_system(); //oasl 操作系统初始化, 包含内存分配、消息队列、定时器、电源管理和任务等,务必重点学习

查看详情

在osalInitTasks();//初始化系统任务中,可以看到各个任务及其初始化的id,注意以下3点

1. 任务优先级决定于任务ID,任务ID越小,优先级越高;

2. BLE协议栈各层的任务优先级比应用程序的高;

3. 初始化协议栈后,越早调入的任务,任务ID越高,优先级越低,即系统倾向于处理新到的任务;

osal_init_system简单理解为设置要在while(1)里边运行的task,osal_start_system就是while(1)循环

在osal_init_system中osalInitTasks这个函数就是设置任务ID,ID1对应task1,ID2对应task2.在osal_run_system里边不断查询需要处理的任务,最后调用对应的ProcessEvent进行处理。

可以看到下面的taskID和tasksArr数组中的序号是一一对应的

为每个任务分配taskID:

查看详情

 

t可以看到askID和下面tasksArr数组中的序号是一一对应的

 

查看详情

 

 

 

  /* Enable interrupts */

  HAL_ENABLE_INTERRUPTS(); //开启中断

查看详情

 

 

 

  // Final board initialization

  InitBoard( OB_READY ); //最终板初始化,总共有三个板初始化状态COLD,WARM,READY,除了COLD外,填啥都一样

查看详情

 

 

 

 

  #if defined ( POWER_SAVING )

    osal_pwrmgr_device( PWRMGR_BATTERY );//检测是否开启低功耗

  #endif

查看详情

 

 

 

  /* Start OSAL   osal 操作系统启动,进入大循环中*/

  osal_start_system(); // No Return from here,整个的大循环入口,务必重点学习

 查看详情

 

 

接下来从 osal_start_system中的osal_run_system函数的任务调度部分开始

查看详情

通过tasksEvents判断任务有没有挂起

最核心的是一个do-while循环,一个if判断。

查看详情

 

 

这个循环就是完成判断当前的事件表中有没有事件发生,如果有就执行下面的代码

 

查看详情

 

 

最后总结一下用户自己设计的任务代码在osal中的调用过程

main() ---> osal_init_system()---> osalInitTasks()--->KeyFobApp_Init( taskID );

在osalInitTasks()中实现了多个任务初始化的设置,接下来研究如何在osal中添加自己的任务

共分为四个步骤:

步骤1:在KeyFobDemo.c中编写任务(事件)处理函数KeyFobDemo_ProcessEvent()

步骤2:将任务事件处理函数添加到在OSAL_KeyFobDemo.c中数组tasksArr[]的最下边

步骤3:在KeyFobDemo.c中编写任务初始化函数KeyFobDemo_Init()

步骤4:在OSAL_KeyFobDemo.c中的osalInitTasks()中调用任务初始化函数KeyFobDemo_Init(),进行任务初始化

此帖出自无线连接论坛
点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表