zoukankan      html  css  js  c++  java
  • 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行,串口初始化函数的形参是串口接收的回调函数---->具体如下:

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

    串口发送函数有多种:

    未完~关注我的cc2541分类

  • 相关阅读:
    C# 管理IIS7(转)
    KeyDown,KeyPress和KeyUp详解(转)
    C#中事件的声明与使用
    在类中使用SERVER
    什么是强类型,强类型集合
    配置sql server 2000以允许远程访问
    如何使textbox只能输入数字和小数点
    在BUTTON中触发GRIDVIEW的方法
    多个GRIDVIEW同时导入到一个EXCEL文件中
    ajax3.5的BUG
  • 原文地址:https://www.cnblogs.com/zjutlitao/p/4769690.html
Copyright © 2011-2022 走看看