FreeRTOS基本概念

freeRTOS任务函数的基本原型:

void ATaskFunction( void *pvParameters );

FreeRTOS的任务是不能返回的,除非在返回之前将任务销毁,销毁任务一般通过vTaskDelete实现,另外每个任务都有自己的栈空间和自己的自动变量(函数本身定义的变量)。一般的任务定义如下:

void ATaskFunctrion(void *pvParameters){
  int iVariableExample = 0;
  while(1){
    /* task code */
  }
  /* delete task before return */
  vTaskDelete(NULL); // use NULL to delete current task
}

任务的创建是通过xTaskCreate实现的,这个函数的原型如下:

protBASE_TYPE xTaskCreate (
  pdTASK_CODE pvTaskCode, // target task function pointer
  const signed portCHAR * const pcName, // task name string, used in debug
  unsigned portSHORT usStackDepth, // stack size in word
  void *pvParameters, // task function parameter pointer
  unsigned portBASE_TYPE uxPriority, // task priority
  xTaskHandle *pxCreatedTask // task handler for task created
);

这个函数的返回值可能有两个:

  1. pdTRUE任务成功创建;
  2. errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY内存空间不足,无法创建新的任务。

应用程序可以包含多个任务,不过同一时间只能有一个任务处于运行状态,也就是任务有两个基本状态:运行状态和非运行状态,其中非运行状态又可以划分成几种不同的子状态。

任务优先级

FreeRTOS支持设置不同优先级设置,优先级数目通过configMAX_PRIORITIES,不过过多的优先级设置会占用大量的内存,所以需要依据项目程序的需要设置合适的优先级数目。有效的优先级是0到configMAX_PRIORITIES-1, 0代表最低优先级。

一般的任务都不会一直占用CPU时间运行,所以都会有一个将任务挂起的点,从而让出CPU运行其它任务,以避免其它任务被饿死。常用的简单的挂起就是延时,FreeRTOS里面的延时是通过vTaskDelay(参数是延时多少个时间片)或者vTaskDealyUntil实现的,这两个函数还是有一些不同的,vTaskDelay是从函数调用的时刻开始计算延时,而vTaskDelayUntil是从函数唤醒的时候就开始计算延时,所以vTaskDelayUntil周期性计时会更加的准确。

任务的子状态

阻塞状态: 如果一个任务正在等待某个事件,称为这个任务处于阻塞状态,等待的事件一般有两种:

  1. 定时相关的事件:比如延时到期或者绝对的一个时间点,比如一个任务进入阻塞状态延时10ms;
  2. 同步事件:等待其它任务事件,比如等待一个队列中有数据到来。FreeRTOS中,队列,二值信号,计数信号量,互斥信号量和互斥量都可以产生同步事件。

挂起状态:处于挂起状态的任务对于调度器是不可见的,程序通过vTaskSuspend()使一个任务处于挂起状态,并通过vTaskResume()或者vTaskResumeFromISR()退出挂起状态。

就绪状态:等待运行的状态,只是准备运行而尚未真正运行。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 13,093评论 6赞 13
  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 30,448评论 8赞 265
  • 今天4月9号。其实原本应该31号写总结的但总是由于各种各样的事情延迟。 3月份做了什么呢? 准备4级考试,要背单词...
    流水记忆阅读 116评论 0赞 0
  • 这些例子包含着有价值的一课,即在调查中关注因果。但是如果我们用那种调查方法来调查一个案例通常是可继续进行的,这堂...
    sxrunn阅读 180评论 0赞 1
  • 今天是周一也是我的12小时工作计划的第一天,早上6点起床,晚上24点睡觉,这样除了吃饭休息,散步,还有有12个小时...
    羊绒衫大王洪陵阅读 428评论 0赞 0

友情链接更多精彩内容