【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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UC/OS-III是一种实时操作系统(RTOS),由Micrium公司开发。它提供了一套完整的内核实现和应用开发框架,可用于嵌入式系统的设计和开发。 该PDF文档是UC/OS-III内核实现和应用开发的指南,涵盖了以下内容: 1. UC/OS-III的概述:介绍了UC/OS-III的基本概念、特点和优势,以及其在嵌入式系统中的应用领域。 2. 内核实现原理:详细解释了UC/OS-III内核的实现原理,包括任务管理、时间管理、内存管理和中断处理等方面。 3. 任务管理:介绍了UC/OS-III任务的创建、删除、切换和同步的方法,以及任务优先级和调度算法。 4. 时间管理:说明了UC/OS-III中时间片轮转和定时器中断的原理,并介绍了如何使用和配置时钟源。 5. 信号量和事件标志组:介绍了UC/OS-III提供的同步机制,包括信号量和事件标志组,以及它们的使用方法和示例。 6. 内存管理:详细说明了UC/OS-III中内存堆的分配和释放机制,以及堆内存管理的配置和实现。 7. 中断处理:介绍了UC/OS-III中对外部中断和事件的处理方式,以及中断优先级的设置和中断服务程序的编写。 8. 实时调试和性能分析:介绍了UC/OS-III提供的实时调试和性能分析功能,包括任务切换的跟踪和时间统计。 通过学习该PDF文档,开发人员可以全面了解UC/OS-III的内核实现和应用开发方法,掌握使用UC/OS-III构建嵌入式系统的技能。该文档还提供了丰富的示例和代码,帮助开发人员快速上手并解决实际应用中的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值