FreeRTOS学习——协同程序

来源:互联网 发布:角色扮演手游推荐知乎 编辑:程序博客网 时间:2024/04/28 16:01

FreeRROS的模块

  • Co-routine协同程序
  • Events事件
  • FreeRTOS-MPU Specific
  • FreeRTOS
  • Kerner control内核控制
  • List列表
  • Queue Set队列设置
  • Queues Managment队列管理
  • Semphore/Mutexes信号量/互斥信号
  • Software Timers软件定时器
  • Task Control任务控制
  • Task Creation任务创建
  • Task Utilities任务应用程序
  • Trace描述


基于FreeRTOS API Reference 8.1.2

一、什么事协同程序
'Co-routine'这是FreeRTOS开发组中的一个鸡肋,过去是应用在小设备上,目前基本上极少使用了!但是开发组不打算删除,但也不再优化和投入开发了!
协同程序从概念上将有点类似任务task,但个任务又有根本上的区别:
1)堆栈用量      所有的协同程序共用一个堆栈,对比task来说大大减少了RAM的需求;
2)时序和优先级     协同程序优先级时序遵从其他协同程序 ,但也可用于抢占式任务    
3)宏实现    协同程序的执行时通过宏实现的;
4)限制条件  较小的RAM需求是以严格的约束如何协同为代价实现的;

二、协同程序的特点
协同程序总结:
  • 协同程序共用一个堆栈,RAM占用少;
  • 重入故障少;
  • 架构便捷;
  • 整体的优先级依赖于其他协同程序,但总是被任务抢占如果两者混用的时候
  • 没有堆栈时需特殊考虑
  • 限制API何处被调用;
  • 协同程序只能在协同程序直接操作;

三、协同程序中的API:
  • crDELAY  阻塞一个协同程序一段时间
  • crQUEUE_RECEIVE  协同程序消息接收请求,类似同于任务中的消息接收请求
  • crQUEUE_RECEIVE_FROM_ISR 协同程序来自中断服务程序中消息的接收请求,类似任务中的来自中断服务程序中消息的接收请求
  • crQUEUE_SEND  协同程序消息发送,类似同于任务中的消息接收发送
  • crQUEUE_SEND_FROM_ISR 协同程序从中断服务程序中消息的发送,类似任务中的从中断服务程序中消息的发送
  • crSTART and crEND 开始和接收协同程序,分别位于每个协同程序的头和尾
  • vCoRoutineSchedule 协同程序调度,
  • xCoRoutineCreate 创建协同程序

四、具体实现
crDELAY( CoRoutineHandle_t xHandle, TickType_t xTicksToDelay );延时的是当前协同程序自己
参数:xHandle      被延时的协同程序的句柄
           xTickToDelay   延时的时间长度,实际时间的数值是通过配置TICK_RATE_HZ (set in FreeRTOSConfig.h)定义的,也可以通过以下计算转换成ms.
      xTickType xDelayTime = 200 / portTICK_PERIOD_MS表征的是200ms

 crQUEUE_RECEIVE(
                    CoRoutineHandle_t xHandle,
                    QueueHandle_t pxQueue,
                    void *pvBuffer,
                    TickType_t xTicksToWait,
                    BaseType_t *pxResult
                )
参数:xHandle  接收的协同程序句柄
            pxQueue   被接收消息队列的句柄,一般是API xQueueCreate()的返回值;
            pvBuffer    被接收消息队列的缓存器,数据长度消息队列创建时已知
            xTicksToWait  等待接收消息的滴答时间数
           pxResult  从消息队列中重读数据的结果,成功/失败


crQUEUE_SEND_FROM_ISR(
                           QueueHandle_t pxQueue,
                           void *pvBuffer,
                           BaseType_t * pxCoRoutineWoken
                      )
参数:pxQueue  被发送出来的消息队列的句柄
            pvBuffer   拷贝接收数据的缓存,数据长度消息队列创建时已知
            pxCoRoutineWoken 协同程序被阻塞一段时间等待消息队列
返回:接收成功和失败,pdTRUE 或者pdFALSE
1 0
原创粉丝点击