arm寄存器相关
https://blog.csdn.net/Z_H_Z_0/article/details/106574292
FreeRtos
相关API
参考资料FreeRTOS 快速入门
创建任务
静态创建任务。在使用该函数前,
FreeRTOSConfig.h
中configSUPPORT_DYNAMIC_ALLOCATION
的宏定义设置为 1(默认为1)。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16/*
如果puxStackBuffer和 pxTaskBuffer 均不为 NULL,则创建任务, 并返回任务的句柄。
如果puxStackBuffer 或 pxTaskBuffer 为 NULL,则不会创建任务, 并返回 NULL。
*/
TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode, /*指向任务入口函数的指针(即实现任务的函数名称*/
const char * const pcName, /*任务的描述性名称。但也可用于获取任务句柄*/
const uint32_t ulStackDepth, /*ulStackDepth 必须设置为数组中的索引数。*/
void * const pvParameters, /*传递给所创建任务的参数。*/
UBaseType_t uxPriority, /*指定创建的任务的优先级执行。*/
StackType_t * const puxStackBuffer, /*必须指向至少包含ulStackDepth个索引的StackType_t数组,
(不能在函数的堆栈上声明)*/
StaticTask_t * const pxTaskBuffer /*必须指向StaticTask_t类型的变量。结构体 (TCB)
(不能在函数的堆栈上声明)*/
);
/*示例*/动态创建任务。在使用该函数前,你必须保证
FreeRTOSConfig.h
中configSUPPORT_DYNAMIC_ALLOCATION
宏定义设置为 1(默认为1)。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16/*如果任务创建成功,则返回 pdPASS,否则返回 errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY。*/
BaseType_t xTaskCreate( TaskFunction_t pvTaskCode, /*指向任务入口函数的指针(即实现任务的函数名称*/
const char * const pcName, /*任务的描述性名称。但也可用于获取任务句柄*/
const configSTACK_DEPTH_TYPE uxStackDepth, /*要分配用作任务堆栈的字数(不是字节数!)。
例如,如果栈宽度为 16 位,uxStackDepth
为 100,则将分配 200 字节用作任务 堆栈*/
void *pvParameters, /*传递给所创建任务的参数。*/
UBaseType_t uxPriority, /*指定创建的任务的优先级执行。*/
TaskHandle_t *pxCreatedTask /*用于将句柄传递至由 xTaskCreate() 函数创建的任务。
pxCreatedTask 是可选参数, 可设置为 NULL。*/
);
/*示例*/
if(xTaskCreate(Oled_task, "Oled_task", 128, &task1, 4, &Oled_TaskHandle_t) == 1)
printf("creat Oled_task sussces\r\n");
else
printf("creat Oled_task false\r\n");
删除任务
void vTaskDelete( TaskHandle_t xTask );
。从 RTOS 内核管理中移除任务。要删除的任务将从所有就绪、 阻塞、挂起和事件列表中移除。INCLUDE_vTaskDelete
必须定义为 1 才可使用此函数。
注意:空闲任务负责释放由 RTOS 内核分配给已删除任务的内存,而任务代码分配的内存不会自动释放, 应在任务删除之前手动释放(例如使用了malloc后必须先free才能删除任务)。
参数
xTask,要删除的任务的句柄。如果传递 NULL,会删除调用任务。
恢复挂起任务
void vTaskSuspend( TaskHandle_t xTaskToSuspend );
挂起任意任务。无论任务优先级如何,任务被挂起后将永远无法获取任何微控制器处理时间。INCLUDE_vTaskSuspend
必须定义为 1,才可使用此函数。
对任务的挂起没有次数,例如对某一任务多次调用vTaskSuspend
,后只需要一次恢复vTaskResume()
即可。
参数xTaskToSuspend
被挂起的任务句柄。传递空句柄将导致调用任务被挂起。恢复任务。
void vTaskResume( TaskHandle_t xTaskToResume );
。恢复挂起的任务。INCLUDE_vTaskSuspend
必须定义为 1,才可使用此函数。
参数xTaskToResume
待恢复任务的句柄。BaseType_t xTaskResumeFromISR( TaskHandle_t xTaskToResume );
。与上一个类似,可从 ISR 内调用的恢复挂起任务的函数。INCLUDE_vTaskSuspend
和INCLUDE_xTaskResumeFromISR
必须定义为 1,才可使用此函数。
参数xTaskToResume
要恢复的任务句柄。
返回
如果恢复任务导致上下文切换,则返回pdTRUE
,
否则返回pdFALSE
。ISR 使用此信息来确定 ISR 之后是否需要上下文切换。
阻塞相关
void vTaskDelay( const TickType_t xTicksToDelay );
。调用vTaskDelay()
后,任务会立刻阻塞xTicksToDelay
个滴答计数。INCLUDE_vTaskDelay
必须定义为 1,才可使用此函数。
根据给定的滴答数来阻塞任务,因此任务阻塞的实际时间取决于滴答的频率,可以通过常量portTICK_PERIOD_MS
来获得每次滴答的实际时间。
注意vTaskDelay()
并不是控制周期性任务的理想方法,因为它的延时是相对延时(相对与vTaskDelay()
被调用的时刻起),会受到任务执行路径、其他任务的影响,其延时并不一定准确例如在第一次执行某之前任务时没有发生任务切换,第二次发生了任务切换,那第一次与第二次的延时就可能不同)。为了解决这个问题,FreeRTOS 提供了vTaskDelayUntil()
函数作为替代方案。
参数xTicksToDelay
调用任务应阻塞的 tick 周期数。void vTaskDelayUntil( TickType_t *pxPreviousWakeTime,const TickType_t xTimeIncrement );
将任务延迟到指定时间。此函数可以由周期性任务使用,来确保恒定的执行频率。INCLUDE_vTaskDelayUntil
必须定义为 1,才可使用此函数。 此函数与vTaskDelay()
不同的是vTaskDelayUntil()
会指定任务希望取消阻塞的绝对时间。
参数pxPreviousWakeTime
指向一个变量的指针,该变量用于保存任务上一次解除阻塞的时间。
该变量在首次使用前必须用当前时间初始化(见下面的示例)。在这之后,该变量 会在vTaskDelayUntil()
内自动更新。xTimeIncrement
周期时间段。该任务将在(*pxPreviousWakeTime + xTimeIncrement)
时间解除阻塞。用相同的xTimeIncrement
参数值调用vTaskDelayUntil
将导致任务以固定的间隔期执行。1
2
3
4
5
6
7
8
9
10
11
12
13/*使用示例*/
void vTaskFunction( void * pvParameters )
{
TickType_t xLastWakeTime;
const TickType_t xFrequency = 10;
xLastWakeTime = xTaskGetTickCount(); //获取当前时间
for( ;; )
{
// Wait for the next cycle.
vTaskDelayUntil( &xLastWakeTime, xFrequency );// Perform action here.
}
}注意如果使用
vTaskDelayUntil()
指定已过去的时间阻塞,函数将立刻返回不阻塞,因此当任务因挂起或其他原因导致错过阻塞时间时,必须重新计算唤醒时间,可以通过检查参数pxPreviousWakeTime
来发现这一情况。当调用了vTaskSuspendAll()
挂起RTOS调度器时,不得调用此函数。BaseType_t xTaskDelayUntil( TickType_t *pxPreviousWakeTime,const TickType_t xTimeIncrement );
。此函数与上一个基本功能相同,唯一区别是返回值。INCLUDE_xTaskDelayUntil
必须定义为 1 ,此函数才可用。
返回返回值用于检查任务是否精确的被延时, pdTRUE 任务被准时延时到指定时间;
pdFALSE
任务没有延迟到指定的时间。另外如果任务执行时间超过了xTimeIncrement
任务将不再被延时。BaseType_t xTaskAbortDelay( TaskHandle_t xTask );
。强制任务离开阻塞状态,并 进入“准备就绪”状态,即使任务在阻塞状态下等待的事件没有发生, 或没有任何指定的超时过期。INCLUDE_xTaskAbortDelay
必须定义为 1,此函数才可用。
参数xTask
将被强制退出阻塞状态的任务的句柄。(要获取任务句柄,请使用xTaskCreate()
创建任务并使用pxCreatedTask
参数, 或使用xTaskCreateStatic()
创建任务并存储返回值, 或在xTaskGetHandle()
的调用中使用任务名称。)
返回
如果xTask
引用的任务不在“阻塞”状态,则返回pdFAIL
。否则返回pdPASS
。
优先级相关。
UBaseType_t uxTaskPriorityGet( const TaskHandle_t xTask );
。 获取任意任务的优先级。INCLUDE_uxTaskPriorityGet
必须定义为 1,才可使用此函数。
参数xTask 待查询任务的句柄。传递 NULL 句柄会返回调用任务的先级。
返回
xTask 的优先级。void vTaskPrioritySet( TaskHandle_t xTask,UBaseType_t uxNewPriority );
。 设置任何任务的优先级。如果正在设置的优先级高于当前执行任务的优先级,则函数返回之前将发生上下文切换。(这意味着vTaskPrioritySet()
函数在返回之前,可能会让出 CPU 给更高优先级的任务。)INCLUDE_vTaskPrioritySet
必须定义为 1,才可使用此函数。
参数xTask
正在设置优先级的任务的句柄。空句柄会设置调用任务的优先级。uxNewPriority
将要设置任务的优先级。应断言优先级低于configMAX_PRIORITIES
,如果configASSERT
未定义,则优先级默认
上限为(configMAX_PRIORITIES - 1)
。UBaseType_t uxTaskPriorityGetFromISR( const TaskHandle_t xTask );
。获取任何任务的优先级。在中断服务程序 (ISR) 中使用此函数是安全的。INCLUDE_uxTaskPriorityGet
必须定义为 1,才可使用此函数。
参数xTask
待查询的任务句柄。传递NULL
句柄会导致返回调用任务的优先级。
返回xTask
的优先级。UBaseType_t uxTaskBasePriorityGet( const TaskHandle_t xTask );
。获取任意任务的基础优先级。任务的基础优先级是任务当前优先级被继承后 将返回的优先级,旨在避免在获取互斥锁时 出现无限制的优先级反转。
优先级继承。当任务尝试获取一个被低优先级任务持有的互斥锁时,FreeRTOS 会临时提高低优先级任务的优先级,使其等于等待互斥锁的高优先级任务的优先级。这是为了避免无界优先级反转。INCLUDE_uxTaskPriorityGet
和configUSE_MUTEXES
必须定义为 1,才可使用此函数。
参数xTask
待查询任务的句柄。传递NULL
句柄会返回调用任务的基础优先级。
返回xTask
的基础优先级。UBaseType_t uxTaskBasePriorityGetFromISR( const TaskHandle_t xTask );
。与上一个函数类似,此函数可以安全地在中断服务程序 (ISR) 中使用。INCLUDE_uxTaskPriorityGet
和configUSE_MUTEXES
必须定义为 1,才可使用此函数。
参数xTask
待查询任务的句柄。传递NULL
句柄将返回调用任务的基础优先级。
返回xTask
的基础优先级。