本帖最后由 聪聪哥哥 于 2025-9-5 20:18 编辑
一:RTOS的知识分享:
RTOS 全称是 RealTime OperatingSystem,中文名就是实时操作系统。可以看出 FreeROTS 就是一个免费的 RTOS 类系统。这里要注意,RTOS 不是指某一个确定的系统,而是指一类系统。、操作系统允许多个任务同时运行,这个叫做多任务,实际上,一个处理器核心在某一时刻只能运行一个任务。操作系统中任务调度器的责任就是决定在某一时刻究竟运行哪个任务,任务调度在各个任务之间的切换非常快!这就给人们造成了同一时刻有多个任务同时运行的错觉。、
RTOS 的任务调度器被设计为可预测的,而这正是嵌入式实时操作系统所需要的,实时环境中要求操作系统必须对某一个事件做出实时的响应,因此系统任务调度器的行为必须是可预测的。像 FreeRTOS 这种传统的 RTOS 类操作系统是由用户给每个任务分配一个任务优先级,任务调度器就可以根据此优先级来决定下一刻应该运行哪个任务。
二:Rtos的任务调度方式:
Rtos支持的任务调度方式共有三种:抢占式调度,时间片调度和携程式调度
2.1 抢占式调度:熟悉arm架构的比较清楚,中断向量分组的知识,针对不同的任务,具有抢占优先级和响应优先级。高优先级的任务可以抢占低优先级的对主芯片的的使用权,当高优先级任务被触发时,可以打断低优先级的任务。同等优先级的任务按先后触发任务执行。
2.1 时间片调度:主要是对同等优先级的任务进行处理。根据每个任务的是否触发任务的标记指针决定是否执行。
2.3 :协程式调度 :当前执行任务将会一直运行,同时高优先级的任务不会抢占低优先级任务。
三:任务状态:
3.1 运行态:正在执行的任务,该任务就处于运行状态,即任务正在占用CPU执行。
3.2 就绪态:如果该任务已经能够被执行,但当前还未被执行,那么该任务处于就绪态。等待调度器分配CPU。
3.3 阻塞态:如果一个任务因为延时或者等待外部事件发生,那么这个任务就处于阻塞态。任务暂时放弃 CPU,等待外部事件(如延时、信号量、队列消息等)。
3.4 挂起态:不会参与调度,类似于暂停,调用函数vTaskSuspend0)进入挂起态,需要调用解挂函数vTaskResume()才可以进入就绪态。
四 :任务状态列表
任务的四种状态中,除了运行态,其他三种任务状态的任务都有其对应的任务状态列表。
4.1就绪列表 :pxReadyTasksLists[x],其中x代表任务优先级数值。
4.2阻塞列表 : pxDelayedTaskList
4.3挂起列表 : xSuspendedTaskList
二:软件代码如下:
2.1 系统执行的时间节拍:
- #ifndef pdMS_TO_TICKS
- #define pdMS_TO_TICKS( xTimeInMs ) ( ( TickType_t ) ( ( ( TickType_t ) ( xTimeInMs ) * ( TickType_t ) configTICK_RATE_HZ ) / ( TickType_t ) 1000U ) )
- #endif
这里配置的是1S执行1000次,1000HZ,也就是1ms中断一次。所以系统最少的时间节点是1ms。
2.2 LED闪烁的任务:
- #define TASK1_TASK_PRIO 5
- #define TASK1_STK_SIZE 256
创建任务:
- xTaskCreate((TaskFunction_t )task1_task,
- (const char* )"task1",
- (uint16_t )TASK1_STK_SIZE,
- (void* )NULL,
- (UBaseType_t )TASK1_TASK_PRIO,
- (TaskHandle_t* )&Task1Task_Handler);
- void task1_task(void *pvParameters)
- {
- UBaseType_t msticks=0;
- msticks = pdMS_TO_TICKS(500);
- while(1)
- {
- printf("LED test ok \r\n");
- GPIO_SetBits(GPIOA, GPIO_Pin_0);
- vTaskDelay(msticks);
- GPIO_ResetBits(GPIOA, GPIO_Pin_0);
- vTaskDelay(msticks);
- }
- }
2.3 串口输出的任务:
- xTaskCreate((TaskFunction_t )task1_task,
- (const char* )"task1",
- (uint16_t )TASK1_STK_SIZE,
- (void* )NULL,
- (UBaseType_t )TASK1_TASK_PRIO,
- (TaskHandle_t* )&Task1Task_Handler);
具体任务如下所示:
- void task2_task(void *pvParameters)
- {
- UBaseType_t msticks=0;
- msticks = pdMS_TO_TICKS(1000);
- while(1)
- {
- printf("usart test ok!\r\n");
- GPIO_ResetBits(GPIOA, GPIO_Pin_1);
- vTaskDelay(msticks);
- GPIO_SetBits(GPIOA, GPIO_Pin_1);
- vTaskDelay(msticks);
- }
- }
三:实物验证如下所示:
|