2540--第一天--程序的流程分析(per)

本文介绍了TI协议栈的OSAL操作系统抽象层及其在BLE低功耗蓝牙中的作用,详细阐述了从main函数开始的程序流程,包括任务初始化、应用层任务处理函数以及设备连接过程。重点讨论了OSAL的任务管理和事件响应机制,以及如何通过回调函数处理系统消息。
摘要由CSDN通过智能技术生成

1.TI协议栈介绍

  • 任务调度—OSAL 操作系统抽象层正如一个公司为了实现扩大产能和产品多样化, 建立了多个办公室和工厂一样,蓝牙为了实现同多个设备相连,或实现多功能,也实现了功能扩充,这就产生了调度问题。因为,虽然软件和协议栈可扩充,但终究最底层的执行部门只有一个。BLE 低功耗蓝牙软件有2个主要组成: OSAL 操作系统抽象层和 HAL 硬件抽象层,多个 Task 任务和事件在 OSAL 管理下工作,而每个任务和事件又包括3个组成:BLE 协议栈,profiles 和应用程序。
  • OSAL 作为调度核心,BLE 协议栈、profile 定义、所有的应用都围绕它来实现。OSAL 不是传统大家使用的操作系统,而是一个允许软件建立和执行事件的循环。软件功能是由任务事件来实现的,创建一个任务事件需要以下工作:
    • 创建 task identifier 任务 ID;
    • 编写任务初始化(task initialization routine)进程,并需
      要添加到 OSAL 初始化进程中,这就是说系统启动后不能动态添加功能;
    • 编写任务处理程序;
    • 如有需要提供消息服务。
  • BLE 协议栈的各层都是以 OSAL 任务方式实现,由于 LL 控制室的时间要求最为迫切,所以其任务优先级最高。为了实现任务管理,OSAL 通过消息处理(messageprocess) ,存储管理,计时器定时等附加服务实现。下面结合代码进行分析

2.程序的流程分析

  • 2.1 从main函数开始,这是函数的程序的入口
int main(void)
{
  /* Initialize hardware */
  HAL_BOARD_INIT();//硬件的初始化,这里后面有分析,这里的初始化主要是对时钟的管理

  // Initialize board I/O
  InitBoard( OB_COLD );//初始化io,冷初始化有分析,第一次进入关中断,关闭所有的灯

  /* Initialze the HAL driver */
  HalDriverInit();//HAL层的初始化

  /* Initialize NV system */
  osal_snv_init();//NV系统的初始化,这个需要重点分析,后面会有文章分析这个东西

  /* Initialize LL */

  /* Initialize the operating system */
  osal_init_system();//这里很重要,初始化任务的地方,重要0001

  /* Enable interrupts */
  HAL_ENABLE_INTERRUPTS();//开中断

  // Final board initialization
  InitBoard( OB_READY );//再次board初始化,热

  #if defined ( POWER_SAVING )
    osal_pwrmgr_device( PWRMGR_BATTERY );
  #endif

  /* Start OSAL */
  osal_start_system(); // No Return from here开始任务轮询,不会返回,重要0002

  return 0;
}
  • 2.2 任务初始化函数,这里有我们的应用层任务初始化
uint8 osal_init_system( void )
{
  // Initialize the Memory Allocation System
  osal_mem_init();

  // Initialize the message queue
  osal_qHead = NULL;

  // Initialize the timers
  osalTimerInit();

  // Initialize the Power Management System
  osal_pwrmgr_init();

  // Initialize the system tasks.
  osalInitTasks();//这个是和我们的任务有关的初始化函数

  // Setup efficient search for the first free block of heap.
  osal_mem_kick();

  return ( SUCCESS );
}
  • 2.3 具体的应用层任务初始化函数
void osalInitTasks( void )
{
  uint8 taskID = 0;

  tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt);
  osal_memset( tasksEvents, 0, (sizeof( uint16 ) * tasksCnt));

  /* LL Task */
  LL_Init( taskID++ );//LL层的初始化

  /* Hal Task */
  Hal_Init( taskID++ );//Hal层的初始化

  /* HCI Task */
  HCI_Init( taskID++ );//Hci接口的初始化

#if defined ( OSAL_CBTIMER_NUM_TASKS )
  /* Callback Timer Tasks */
  osal_CbTimerInit( taskID );
  taskID += OSAL_CBTIMER_NUM_TASKS;
#endif

  /* L2CAP Task */
  L2CAP_Init( taskID++ );//L2cap初始化

  /* GAP Task */
  GAP_Init( taskID++ );//这两个重要

  /* GATT Task */
  GATT_Init( taskID++ );

  
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值