FreeRTOS 第一章 多任务系统

在最早接触嵌入式的时候,我们编写的代码都是在一个while循环里处理所有的事务。

int main()
{
    while(1)
    {
      do_something();
      do_something1();
      do_something2();
    }
}

这三个事务轮流执行。逻辑简单。但会带来一个问题:

事务1在执行的时候,事务2得不到运行,如果此时事务2更紧急,却得不到运行的机会。

因为三个事务轮流执行的。如果事务1和2大部分时间不需要处理,这样就浪费了时间。

所以我们就引入了操作系统的概念。我们把三个事务分成3个task。同时对事务的优先级进行设定。这样紧急的任务可以获得更多的机会运行。

看起来3个任务都同时在运行。但是某一时刻只能有一个任务在运行。任务之间的切换有操作系统的调度器完成。

任务状态

既然任务之间可以切换,同一时刻只能有一个任务在运行。那么任务的状态肯定就会分为很多种。

运行态:

当一个任务正在运行时,那么就说明这个任务处于运行状态,处理运行状态的任务是当前正在使用处理器的任务。如果使用的是单核处理器的话那么不管在任何时刻永远都只有一个任务处于运行态。

就绪态:

处于就绪态的任务就是那些已经准备就绪(这些任务没有被阻塞或者挂起),可以运行的任务,但是处于就绪态的任务还没有运行,因为有一个同优先级或者更高优先级的任务正在运行!

阻塞态:

如果一个任务当前正在等到某个事件的话就会进入阻塞态,比如说如果某个任务调用了vTaskDelay()的话就会进入阻塞态,直到延时周期完成。任务在等待队列、信号量、事件组等的时候就会进入阻塞态。任务进入阻塞态会有一个超时时间,当超过这个超时时间任务就会退出阻塞态,即使等待的时间还没有到来。

挂起态:

将阻塞一样,任务进入挂起后不能被调度器调用进入运行态,但是进入挂起态的任务没有超时时间。任务进入和退出挂起态经过调用函数vTaskSupend()和xTaskResume()。

任务状态转换如下图:

 任务优先级

每个任务都可以分配一个从0到configMax_PRIORITIES-1的优先级。数字越低优先级越低。考虑到RAM的消耗,config_PRIORITIMES满足应用即可,不宜设置过大。

调度器确保处于就绪态或者运行态的高优先级任务获得处理器使用权。当configUSE_TIME_SLICING定义为1的时候多个任务可以共用一个优先级。此时处于就绪态的优先级相同的任务就会使用时间片轮转调度器获取运行时间。

### FreeRTOS 教程 第一章 内容 #### 1. 创建任务 FreeRTOS 是一种轻量级的操作系统内核,专为微控制器设计。在第一章中介绍了如何创建任务以及初始化必要的组件来启动调度器。 当调用 `xTaskCreate` 函数时会传入一个指向任务入口函数的指针、任务名称字符串、堆栈大小以及其他参数[^3]。一旦成功创建了一个新任务,则该任务会被放置于就绪状态列表里等待被CPU执行;然而,在此之前还需要完成一些额外的工作才能真正激活这些已定义好的线程: - **配置定时器 (可选)**:如果应用程序启用了定时功能 (`configUSE_TIMERS`) ,那么除了用户自定义的任务外还会自动建立两个特殊的后台进程——空闲(idle) 和 定时器(timers)。 - **启动调度机制**:通过调用 `vTaskStartScheduler()` 来正式开启多任务环境下的资源分配流程。值得注意的是这一步骤在整个应用生命周期只会发生一次,并且一旦开始便不会结束直到整个系统关闭为止。 ```c // 示例代码展示如何创建并启动第一个任务 void vAFunction( void ) { // 创建一个新的任务... xTaskCreate( prvSetupHardware, /* Task function */ "SETUP", /* String with name of task */ configMINIMAL_STACK_SIZE,/* Stack size in words, not bytes */ NULL, /* Parameter passed into task */ tskIDLE_PRIORITY, /* Priority at which the task is created */ &xHandle ); /* Used to pass out the created task's handle */ // 启动任务调度器 vTaskStartScheduler(); } ``` 在这个过程中,开发者需要注意合理规划各个子模块间的交互逻辑以确保整体架构稳定可靠的同时也能够充分利用有限计算能力达到预期性能指标。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

依然@Fantasy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值