FreeRTOS

1、内存管理

C中的堆栈:

FreeRTOS的内存管理接口函数:

        pvPortMalloc、vPortFree分别对应于C中的malloc和free函数

2、任务管理

1.任务状态

        运行(Runing)非运行(Not_Running)

        非运行:阻塞状态(Blocked)、暂停状态(Suspended)、就绪状态(Ready)

  • 阻塞状态(Blocked):

        处于等待状态,等待两种类型事件

  1. 时间相关事件:等待一段时间或者等到某个绝对时间
  2. 同步事件:由其他任务或者中断程序产生
  • 暂停状态(Suspended):

        1、任务进入暂停状态,只能通过vTaskSuspend函数

        void vTaskSuspend(TaskHandle_t, vTaskToSuspend);

        vTaskToSuspend表示要暂停的任务,为NULL时表示暂停自己

        2、退出暂停状态,只能由别人操作

        别的任务调用:vTaskResume

        中断程序调用:xTaskResumeFromISR

  • 就绪状态(Ready):

        任务已准备好,随时可以执行

2.Delay函数
  • vTaskDelay:至少等待指定个数的Tick Interrupt才能变为就绪状态
  • vTaskDelayUntil:等待到指定的绝对时刻,才能变为就绪态
3.空闲任务以及钩子函数
  • 空闲任务(IDLE)

    作用:

  1. 释放被删除的任务的内存
  2. 使得任务调度器必须能够找到一个可以运行的任务

    特点:优先级为0、要么处于就绪态,要么处于运行状态

注意:如果使用vTaskDelete()来删除任务,那么你就要确保空闲任务有机会 执行,否则就无法释放被删除任务的内存

  • 空闲任务钩子函数(Idle Task Hook Functions)

   作用:

  1. 执行一些低优先级的、后台的、需要连续执行的函数
  2. 测量系统的空闲时间
  3. 让系统进入省电模式
4.调度算法

        就绪态的任务,可以被调度器挑选出来来回切换运行状态,调度器永远都是挑选最高优先级的就绪态任务并让它进入运行状态

        调度算法即如何确定哪个就绪态的任务可以切换为运行状态

3、同步、互斥、通信

实现同步互斥的内核方法:任务通知、队列、事件组、信号量、互斥量

共同点:操作方法类似,获取/释放、阻塞/唤醒、超时

1.队列
  • 队列传输数据:
  1. 拷贝:将变量、数据的值复制进队列中
  2. 引用:将变量、数据的地址复制进队列中

        无需分配buffer来保存数据,队列中有buffer

        队列空间由FreeRTOS内核分配

        对于有内存保护功能的系统,如果队列使用引用方法,也就是使用地址,必须 确保双方任务对这个地址都有访问权限。使用拷贝方法时,则无此限制:内核有足 够的权限,把数据复制进队列、再把数据复制出队列。

        队列的读写对任务个数没有限制,当多个任务在等待读/写队列的数据,哪个任务先进入就绪状态?

  • 优先级最高的任务
  • 优先级相同,等待时间最久的任务进入就绪状态

4、中断管理

1、ISR(interrupt service rountine):中断服务程序

特点:

  • 不能进入阻塞状态,需要尽快执行
  • 在内核中被调用,执行过程中用户的任务无法执行,ISR优先级高于任务
  • 在ISR中调用API,不进行任务切换,而是返回是否任务切换的标志(效率高、程序更可控、可移植性)

2、

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

alwaysonlinee

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

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

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

打赏作者

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

抵扣说明:

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

余额充值