当前位置: 代码迷 >> 综合 >> FreeRTOS 系统使用
  详细解决方案

FreeRTOS 系统使用

热度:93   发布时间:2023-12-16 08:29:38.0

ps:参考其他人的教程,先记录以后用到查一查。

第一章 FreeRTOS 基础
1. 任务函数
 任务函数原型:void ATaskfunction(void *pvParameters);

(1)每个任务通常会运行在一个死循环中,FreeRTOS任务不允许以任何形式从实现函数中返回;
(2)创建的每个任务实例拥有自己的栈空间和自动变量;
:在任务实例中定义的变量如果是static修饰,则所有任务实例共享此变量。
(3)如果一个任务不再需要,则必须在函数运行完之前用vTaskDelete()删除;

2. 任务状态

(1)任务从非运行态转移到运行态称为“切入”;任务从运行态转移到非运行态成为“切出”;

3.任务创建

(1) xTaskCreate() API 原型:

portBASE_TYPE xTaskCreate(  pdTASK_CODE pvTaskCode,const signed portCHAR * const pcName,unsigned portSHORT usStackDepth,void *pvParameters,unsigned portBASE_TYPE uxPriority,xTaskHandle *pxCreatedTask );
注:usStackDepth 指定的是栈空间可以保存多少个 字(word),而不是多少个字节(byte);栈深度x栈宽度结果不能超过 size_t 类型所能表达的最大值;
4.任务优先级

(1)任务的优先级可以在调度器启用之后调用 vTaskPrioritySet() 函数进行修改;
(2)配置最大优先级数目:configMAX_PRIORITYS的值越大,内核花销的内存空间就越多;
(3)优先级号 0 表示最低优先级;
(4)心跳中断的频率由configTICK_RATE_HZ设定,设置为100 则时间片长度为 10ms

5.任务的非运行态

(1)“阻塞”:一个任务正在等待某个事件;任务进入阻塞态可以等待的两种事件:定时事件、同步事件;
(2)“挂起”:对调度器而言不可见;使任务挂起调用vTaskSuspend(),唤醒任务调用 vTaskResume()vTaskResumeFromISR()
(3)“就绪”处于非运行态,但没有阻塞也没有挂起,“准备运行”但尚未运行;

6.空闲任务

(1)空闲任务优先级为0
(2)空闲任务钩子函数用于:a、执行低优先级,后台或需要不停处理的功能代码;b、测试系统处理裕量;c、将处理器配置到低功耗模式;
(3)空闲任务钩子函数遵从规则:a、绝不能阻塞或挂起;b、如果应用程序用到了vTaskDelete() 函数,空闲钩子函数必须能够尽快返回,否则空闲任务无法进行内核资源回收工作;
(4)空闲任务钩子函数原型:

void vApplicationIdleHook(void);
注:configUSE_IDLE_HOOK必须定义为1,空闲钩子函数才能被调用。
第二章 队列

(1)创建队列

函数原型:
xQueueHandle xQueueCreate(  unsigned portBASE_TYPE uxQueueLength,unsigned portBASE_TYPE uxItemSize  );

(2)队列中读取数据
a、xQueueReceive() 用于从队列中读取数据单元,同时数据单元从队列中删除;
b、xQueuePeek() 从队列中读取数据后,数据单元不会从队列中删除;
(3)查询队列中当前有效数据单元个数

函数原型:
unsigned portBASE_TYPE uxQueueMessagesWaiting( xQueueHandle xQueue );

(4)队列用于大型数据
当队列存储数据单元较大时,需使用传递数据指针的方式使用队列;切记用指针访问任务栈上分配的空间;

第三章 中断

(1)二值信号量同步
a、创建二值信号量:

void vSemaphoreCreateBinary( xSemaphoreHandle xSemaphore );
注:此 api 在实现上是一个宏,信号量变量要直接传入,而不是传址。

b、获取信号量
除了互斥信号量以外,其他所有信号量都可以使用 xSemaphoreTake() 来获取。

(2)计数信号量
a、计数信号量的两种典型用法:事件计数和资源管理;
b、创建计数信号量:使用 xSemaphoreCreateCounting() 函数创建;

  相关解决方案