作者最近在学习正点原子的基于STM32H743的FreeRtos例程,在学习的过程中有个疑问,Freertos是如何保证某个函数被固定周期调用,比如每100ms就要运行一次某个函数,上下周期波动很小,貌似的例程中并没有对固定周期的调用进行介绍
下面是代码:
首先是函数优先级的设定等,这个是没有疑问的
//开始任务
#define START_TASK_PRIO 1
#define START_STK_SIZE 128
TaskHandle_t StartTask_Handler;
void start_task(void *pvParameters);
//任务1
#define TASK1_TASK_PRIO 9
//任务1堆栈空间设定
#define TASK1_STK_SIZE 128
//任务句柄
TaskHandle_t Task1Task_Handler;
//任务函数
void task1_task(void *pvParameters);
//任务2
#define TASK2_TASK_PRIO 3
//任务2堆栈大小
#define TASK2_STK_SIZE 128
//任务2句柄
TaskHandle_t Task2Task_Handler;
//任务2函数
void task2_task(void *pvParameters);
char RunTimeInfo[400]; //程序运行时间
然后是在mian函数中运行和创建任务
int main(void)
{
Cache_Enable();
HAL_Init();
Stm32_Clock_Init(160,5,2,4);
delay_init(400);
LED_Init();
SDRAM_Init();
FDCAN1_Mode_Init(10,8,31,8,FDCAN_MODE_NORMAL);
uart_init(115200);
RS485_Init(115200);
uart3_init(115200);
TIM2_Init(50-1,200-1);
//其他初始化省略………………………………
//开始任务创建
xTaskCreate((TaskFunction_t )start_task,
(const char* )"start_task",
(uint16_t )START_STK_SIZE,
(void* )NULL,
(UBaseType_t )START_TASK_PRIO,
(TaskHandle_t* )&StartTask_Handler);
vTaskStartScheduler();
}
//开始任务
void start_task(void *pvParameters)
{
taskENTER_CRITICAL();
//任务1
xTaskCreate((TaskFunction_t )task1_task,
(const char* )"task1_task",
(uint16_t )TASK1_STK_SIZE,
(void* )NULL,
(UBaseType_t )TASK1_TASK_PRIO,
(TaskHandle_t* )&Task1Task_Handler);
//任务2
xTaskCreate((TaskFunction_t )task2_task,
(const char* )"task2_task",
(uint16_t )TASK2_STK_SIZE,
(void* )NULL,
(UBaseType_t )TASK2_TASK_PRIO,
(TaskHandle_t* )&Task2Task_Handler);
vTaskDelete(StartTask_Handler); //删除开始任务
taskEXIT_CRITICAL();
}
//任务1
void task1_task(void *pvParameters)
{
u8 task1_num=0;
while(1)
{
task1_num++; //函数运行次数计数
LED0_Toggle;
vTaskDelay(1000); //延时1000ms,在延时期间可以处理其他函数
}
}
//任务2
void task2_task(void *pvParameters)
{
u8 task2_num=0; //任务2运行次数计数
while(1)
{
data_report3(); //这里是作者写的一个小函数,用于采集的单机数据上报
vTaskDelay(100); //延迟100ms
}
}
是如何保证任务2每100ms运行一次呢,假设任务2在100ms以内肯定能运行完成,但是好像还是会受其他任务函数的影响,仅仅通过调整优先级就能保证运行周期吗,这个作者不太理解,希望有大神能够帮忙解析一下