1.常见的FreeRtos函数
1.1 xTaskCreate函数,动态创建任务。
BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,
const char * const pcName,
const configSTACK_DEPTH_TYPE usStackDepth,
void * const pvParameters,
UBaseType_t uxPriority,
TaskHandle_t * const pxCreatedTask )
其中pxTaskCode为任务函数,pcName为任务名字, usStackDepth为栈的深度,pvParameters为参数,uxPriority为任务的优先级, pxCreaterdTask为任务的handle。handle中可以为NULL, 参数为空时pvParameters也可以为空。
在创建一个任务,每个任务使用TCB_t结构体进行描述,在使用上述函数时采用动态内存分配内存给结构体,采用malloc,handler用于指向该结构体的指针 TaskHandle_t *,栈用于保存函数返回的地址和变量等。
1.2 xTaskCreateStatic函数,静态创建任务。
TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode,
const char * const pcName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
const uint32_t ulStackDepth,
void * const pvParameters,
UBaseType_t uxPriority,
StackType_t * const puxStackBuffer,
StaticTask_t * const pxTaskBuffer )
静态任务就是要事先分配好TCP以及栈。其中通过定义 一个静态数据传入到函数参数作为这个静态函数的一个栈,这个数组的个数与ulStackDepth相同,且每一位大小为4.
要使用该函数创建静态任务首先需要使能#define configSUPPORT_STATIC_ALLOCATION 1,其次由于要调用该函数需要给空闲任务定义 空闲任务PCB,空闲栈以及栈大小,使用如下函数定义。
void vApplicationGetIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer, StackType_t ** ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize )
1.3 vTaskDelet
该函数通过任务句柄删除相应的任务,如果要删除任务自身只需要在自身任务中传入NULL便可。
1.4 vTaskDelay
该函数可以让任务从执行该语句处延时一定的时间。 可以保证任务的休息时间一致,但不能保证执行的任务是否周期性运行,因为任务执行语句每一次执行的时间可能不一致。
1.5 vTaskDelayUntil
该函数可以让执行从指定的时间点延时设定的时间,达到周期性执行的效果。可以在任务开始前记录任务的开始时间,然后执行函数延时相应的毫秒。
2. 数据类型
TickType_t: Freertos中配置了一个周期性的时钟中断:Tick Interrupt,每发生一次中断中断次数会累加被称为tick count,这个变量的类型便为TickType_t。对于32位架构建议设置为32位。
BaseType_t:该架构最高效的数据类型,如果是32位架构则为uint32_t,如果是16位则为uint16_t.这种数据类型通常用作简单的返回值的类型,还有逻辑值,比如pdTrue/pdFalse等。
3.同一个函数被多个任务调度
使用同一个函数创建多个任务的时候,由于享用的栈区并不相同,所以他们运行的效果并不回同步。
4.当任务里面的局部变量较多超过了栈大小
由于变量太多破坏了栈头也就是pcb等,这样会让程序崩毁,陷入hardFault中。
5.FreeRtos任务状态及切换
FreeRtos中任务切换的基准时间为1ms,每1ms切换一次。
任务状态可以分为:运行态,就绪态,阻塞态,暂停态。
运行态:任务被cpu运行的时候的状态。
就绪态:任务可以运行,在优先级轮到他的时候按顺序执行。
阻塞态:任务被某些事件阻塞,比如取二值变量没有可取的变量,此时需要等待该变量可以获取才会停止阻塞。
暂停态:任务主动或被动休息。
6. 在用软件仿真停滞
在修改了芯片型号的时候,跟着卫东山freertos测试软件仿真总是停留在以下界面
需要修改如下界面:
将Dialog DLL更改为DARMSTM.DLL, Parameter更改为对应的型号。