【9】uC/OS-III应用开发————>任务信号量(STM32F767)

  1. 简述
    1. uC/OS提供任务信号量这个功能,每个任务都有一个32位(用户自定义位宽)的信号量值SemCtr,这个信号量值在任务控制块中包含的,是任务独有的一个信号量通知值
    2. 多数情况下,任务信号量可以替代内核对象的二进制信号量、计数信号量
  2. 特点
    1. 任务信号量更加灵活、速度快、节省RAM、无需单独创建信号量
    2. 只能有一个任务接收信号,必须指定接收信号量的任务,才能正确发送信号量,
  3. 相关函数
    1. OSTaskSemPend();  等待任务信号量
    2. OSTaskSemPendAbort();  取消等待任务信号量
    3. OSTaskSemPost();  发布任务信号量
    4. OSTaskSemSet();  强行设置任务信号量计数
    5. 常用函数: 发布、等待任务信号量
  4. 例程
    1. 任务信号量代替二进制信号量
      1. 发送
        /**************************************************
         * 函数名:static void AppTaskKey(void *p_arg)
         * 描述  :按键检测
         * 输入  :无
         * 输出  :无
         * 返回  :无 
         * 调用  :内部调用 
         **************************************************/
        static void AppTaskKey(void *p_arg)
        {
            OS_ERR err;
            
            uint8_t KeyValue;
        
            (void)p_arg;
            
            for(;;)
            {
                KeyValue = BSP_KEY_Scan(0);
                if(KeyValue == Key0_PH3_Value)
                {
                    printf("\r\n 发送任务信号量 \r\n");
                    
                    OSTaskSemPost( (OS_TCB          *)&AppTaskLedTCB,       //目标任务
                                   (OS_OPT           )OS_OPT_POST_NONE,     //没选项要求
                                   (OS_ERR          *)&err);                //返回错误类型
                } 
                OSTimeDlyHMSM ( 0, 0, 0, 20, OS_OPT_TIME_DLY, & err );                   //每20ms扫描一次           
            }
        }

         

      2. 接收
        /**************************************************
         * 函数名:static void AppTaskLed(void *p_arg)
         * 描述  :led应用
         * 输入  :无
         * 输出  :无
         * 返回  :无 
         * 调用  :内部调用 
         **************************************************/
        static void AppTaskLed(void *p_arg)
        {
            OS_ERR err;
            
            CPU_TS ts;
            CPU_INT32U cpu_clk_freq;
            
            (void)p_arg;
            
            cpu_clk_freq = BSP_CPU_ClkFreq();   //获取CPU时钟,时间戳以该时钟计数
              
            for(;;)
            {
                OSTaskSemPend( (OS_TICK         )0,                     //无期限等待
                               (OS_OPT          )OS_OPT_PEND_BLOCKING,  //如果信号量不可用就等待
                               (CPU_TS         *)&ts,                   //获取信号量被发布的时间戳
                               (OS_ERR         *)&err);                 //返回错误类型
                
                ts = OS_TS_GET() - ts;      //计算信号量发布到接收的时间差
        
                LED1_TOGGLE;  
                
                printf("\r\n 任务信号量从被发送到被接收的时间差是%dus \r\n", ts / (cpu_clk_freq / 1000000) );
            }
        }

         

    2. 任务信号量代替计数信号量
      1. 发送
      2. 接收
  5. 下载验证
    1. 任务信号量代替二进制信号量
    2. 任务信号量代替计数信号量
  6. 总结
    1. 两个任务优先级相同的函数,调用同一个按键检测,后执行的任务,检测不到按键,应该是按键检测程序有问题
  7. 参考资料:
    1. 正点原子《STM32F767 UCOS开发手册》
    2. 野火《uC/OS-III内核应用与开发》
    3. 《嵌入式实时操作系统 uC/OS-II原理及应用(第二版)》
    4. 官方源码
  8. 硬件平台:
    1. 正点原子阿波罗F767
  9. 软件平台:
    1. MDK5.2.5
  10. 库版本:
    1. TM32Cube_FW_F7_V1.4.0
  11. uC/OS-III版本
    1. UCOSIII 3.04
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值