FreeRTOS笔记(一)概念


01 - 说在前面

  嵌入式系统经常在无人值守、环境恶劣和时间限制等等的条件下运行,如果条件偏向于时间限制,就需要嵌入式系统具有实时机制,嵌入式实时操作系统的设计就显得非常重要。
  现有的嵌入式实时操作系统很多,有FreeRTOS、RT-Threads、uC/OS-II等等,大多数都是开源的,但开源不代表免费,对于学习而言,建议uC/OS-II或者FreeRTOS,不过uC/OS-II开源但不免费,而FreeRTOS开源又免费,所以小白欣然选择了FreeRTOS进行学习。


02 - FreeRTOS思维导图(点击文字下载)

  小白在看完FreeRTOS实时内核使用指南之后,因为本身有操作系统的基础,因此概念能够快速过一遍,然后用Xmind思维导图工具做了FreeRTOS笔记,内容如下:

2.1 任务

  当嵌入式系统只有单核(往往只有单核)的时候,意味任何时候只有一个任务在执行,由于嵌入式系统是多任务系统,于是任务之间存在切换,所以任务之间的交替工作需要调度器的存在。同时由于调度器的存在,任务就存在状态的概念

【任务】
特点:死循环、不会返回、不会执行到函数末尾,只能被删除或者一直运行
状态:纵观分为运行态和非运行态,其中非运行态分为就绪态、阻塞态和挂起态(小白应该觉得还有一个称为僵尸态)
调度:任务的切换需要调度器的工作,调度器有调度算法去判断当前选择哪一个任务执行,因此任务存在优先级和时间片,优先级越高,任务越快得到执行,时间片越短,任务正常切换的频率越快
【状态转换】
主动行为:状态之间可以进行特定的转换,这一般需要一些事件的发生,状态的转换一般是任务的主动行为。
僵尸态:虽然在书中没有提及,但是如果某个任务被杀死了,那么它应该要留下一些信息(尸体)供系统去查看和回收资源(收尸),比如被谁杀死的,杀死的时候完成了什么工作等等,所以称为僵尸态。

2.2 队列

  既然是多任务系统,那么任务之间必定需要通讯,FreeRTOS的任务通讯都是基于队列进行的(比如信号、信号量、共享内存等等),定义好各种队列就能进行各种通讯。当多个任务共享一个队列的时候,就存在数据安全问题,FreeRTOS根据任务的优先级去进行读写互斥。

2.3 中断

  嵌入式实时系统需要对环境事件进行及时的反应,这种时间上不可预料的事件一般通过中断的方式通知系统。中断概念中的中断服务程序理应是越短越好,例如中断只发出一个信号,然后唤醒某个任务进行工作。因此FreeRTOS的中断处理都是基于中断延迟处理。

【延迟中断处理】
二值信号量:深度=1的队列,可以令任务阻塞在等待队列中,中断到来后给队列添加资源,让阻塞任务得以解除,然后执行对应工作
计数信号量:深度>1的队列,解决二值信号只能锁存一个中断的缺点

2.4 资源管理

  嵌入式实时系统一般有很多外部资源,比如DMA、显示屏、音频通道、UART等等,而且一般为不可共享资源,这些资源的访问必须互斥进行。FreeRTOS采用4种方法实现互斥。

【互斥机制】
临界区:仅仅把所有中断关掉,任务和中断都不能打断
挂起调度器:临界区非常苛刻,挂起调度器可以被中断打断
互斥量:互斥量在P请求之后必须自己V归还
守护任务:某个资源被某个任务守护,只有这个任务才能访问资源,其它任务必须间接通过守护任务访问

2.5 内存管理

  每当任务、队列或者信号量被创建的时候,内核就需要进行动态内存分配,因此嵌入式实时系统必定有内存管理
  但是在小型嵌入式系统中,通常是在调度器运行之前就创建好任务、队列和信号量了,表明动态内存分配只出现在真正的实时任务之前,而且一旦分配就不会释放,意味着动态内容分配不需要考虑太过复杂的情况。
  FreeRTOS提供了几种内存管理范例,也可以自己实现自己的内存管理。

【Sv9.0.0版本的范例】
Heap_1.c:实现了一个最基本的 pvPortMalloc()版本,内存抽象为数组,下一个任务的内存分配地址紧接着上一个任务,而且没有实现vPortFree()
Heap_2.c:在Heap_1上修改,使用最佳匹配算法实现了一个基于空闲内存块的pvPortMalloc()版本,实现了vPortFree()
Heap_3.c:调用了stdlib库的malloc()和free(),挂起调度器使得线程安全
Heap_4.c:在Heap_2的基础上修改,在释放内存的时候并相邻空闲的内存块。
Heap_5.c:在Heap_4的基础上修改,添加了分配不相邻内存的算法

03 - 总结

  • 任务是FreeRTOS的基本执行单位,任务具有状态之分
  • 任务直接的通讯介质都是基于队列实现的
  • FreeRTOS的中断处理都是基于延迟中断处理
  • FreeRTOS提供了4中资源互斥访问机制
  • FreeRTOS提供一些常用的内存分配算法
  • 10
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
FreeRTOS是一个开源的实时操作系统(RTOS),专门用于嵌入式系统。它提供了一套可移植的API,使开发者能够轻松地编写多任务应用程序。 以下是一些关于FreeRTOS笔记: 1. 任务(Tasks):FreeRTOS使用任务实现并行执行。每个任务都有自己的独立堆栈空间和优先级。任务可以创建、删除和挂起。 2. 调度器(Scheduler):FreeRTOS的调度器负责决定哪个任务应该在给定时间运行。它使用优先级调度算法,并且可以配置为使用抢占式或协作式调度。 3. 信号量(Semaphores):信号量是一种用于同步和通信的对象。它可以用于任务之间的互斥访问共享资源或任务之间的通信。 4. 队列(Queues):队列提供了一种任务之间传递数据的方式。任务可以将数据发送到队列,另一个任务可以从队列中接收数据。 5. 事件标志组(Event Flags):事件标志组用于任务之间的同步和通信。一个任务可以等待一组特定的事件标志发生,另一个任务可以设置或清除这些事件标志。 6. 定时器(Timers):FreeRTOS提供了软件定时器,可以在指定时间间隔内运行回调函数。 7. 内存管理(Memory Management):FreeRTOS提供了内存管理功能,可以动态分配和释放内存。 8. 中断(Interrupts):FreeRTOS可以与硬件中断一起使用,以实现任务的抢占式调度。 这些只是FreeRTOS的一些基本概念和功能,它还有很多其他特性和组件。如果你对某个特定方面有更多的兴趣,请告诉我,我会提供更详细的信息。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值