操作系统——FreeRTOS任务

操作系统——FreeRTOS任务
#什么是任务
操作系统的主要任务是处理诸如:管理与配置内存、决定系统资源供需的优先次序、控制输入与输出设备、操作网络与管理文件系统等基本事务。
操作系统的类型非常多样,不同机器安装的操作系统可从简单到复杂,可从移动电话的嵌入式系统到超级计算机的大型操作系统。
许多操作系统制造者对它涵盖范畴的定义也不尽一致,例如有些操作系统集成了图形用户界面,而有些仅使用命令行界面,而将图形用户界面视为一种非必要的应用程序。
操作系统的主要任务是处理诸如:管理与配置内存、决定系统资源供需的优先次序、控制输入与输出设备、操作网络与管理文件系统等基本事务。操作系统也提供一个让用户与系统交互的操作界面。
以现代标准而言,一个标准PC的操作系统应该提供以下的功能:

1、进程管理(Processing management)

2、内存管理(Memory management)

3、文件系统(File system)

4、网络通信(Networking)

5、安全机制(Security)

6、用户界面(User interface)

7、驱动程序(Device drivers)
#任务状态
1.阻塞:通过函数vTaskSuspend()和vTaskResume()任务进入和退出阻塞状态,它没有超时规定。
2.挂起:一个任务正在等待一个外部事件,通俗说就是任务等待其他因素触发,然后此时就是挂起状态(超出规定时间退出阻塞状态)
3.就绪:准备运行的任务,此外现在有一个任务比这个任务优先级高正在运行,同时该任务不能被阻塞和挂起
4.运行:任务正在运行
##分析函数
pxCurrentTCB:记录现在运行的任务;
pxReadyTasksLists:记录处于ready状态,等待被调度运行的任务,这是一个链表数组,ready list安装优先级进行分类,这样在调度时就可以从优先级高的readylist中先进行调度,是调度器直接操作对象。

xDelayedTaskList1:定义了一个delay的task链表,这两个是阻塞表。
xDelayedTaskList2:定义了一个delay的task链表,delay的task链表是指调用了taskdelay()或者因为阻塞动作被延时的任务,延时的单位为tick。Delaylist按照delay的tick时间进行排序,之所以定义了两个,是为了防止xTickCount发生反转时,一个list无法完全标识。

xTickCount:无符号数字,标识运行后到现在的系统产生的tick数,每个tick发生时,xTickCount++,当xTickCount发生翻转时,pxDelayedTaskList和pxOverflowDelayedTaskList进行对调,Overflowlist变为正常的delay list。
pxDelayedTaskList和pxOverflowDelayedTaskList是链表指针,分包指向xDelayedTaskList1和xDelayedTaskList2。

xPendingReadyList:任务进入就绪状态,但是没有放入readylist链表。这种情况发生在调度器被停止时,有些任务进入到ready状态,这时就讲任务加入到xPendingReadyList,等待调度器开始时,从新进行一次调度。
我们知道任何操作系统都有临界区或者在执行某段代码时不想被打断,防止破坏某些关键操作的完整性。Freertos可以采取多种方式避免,如果是不希望被中断打断,需要调用:

xPendingReadyList就是在调度器被暂停时,新的任务进入了ready状态,因此先保存起来,在xTaskResumeAll时再加入到相应的ready list中。
xTasksWaitingTermination:表示等待结束的任务,注意是为了释放这些任务的资源,在任务删除时会有详细的介绍。
xSuspendedTaskList:表示被暂停的任务列表,调用tasksuspend函数。
xIdleTaskHandle:表示空闲任务的句柄,freertos默认为我们创建了一个IDLE函数,一般优先级为0,即最低。
uxCurrentNumberOfTasks:目前所有的任务数。
xTickCount:系统开始后所有的tick计数。
uxTopReadyPriority:记录当前ready list中优先级最高的任务,这个是个32位的无符号整形数据,如果你使能了configUSE_PORT_OPTIMISED_TASK_SELECTION,uxTopReadyPriority使用bit mask的方式标识就绪状态的最高优先级(freertos最大优先级数为32),前提是你的C运行库支持__builtin_clz(返回某个数据的前导0个数),这个功能一般会开启,因此就限制了最大优先级为32。如果不开启configUSE_PORT_OPTIMISED_TASK_SELECTION,最大优先级没有限制,但是会增大ready list占用的资源。
xSchedulerRunning:调度器是否运行。
uxPendedTicks:前面讲到的vTaskSuspendAll,暂停了调度器,如果这期间tick的timer发送中断,这时uxPendedTicks记录了未被处理的ticks个数。
xYieldPending:在某种临界状态下,任务状态发生改变,需要等待从新调度。
xNumOfOverflows:记录tick计数翻转的次数。
uxTaskNumber:用来记录全局任务数,为新建的任务分配一个task number。
xNextTaskUnblockTime:记录了延时链表中,第一个需要被唤醒的任务时间点。
uxSchedulerSuspended:调度器暂定标志。
##操作系统中挂起和阻塞的区别如下:
  一:挂起是一种主动行为,因此恢复也应该要主动完成,而阻塞则是一种被动行为,是在等待事件或资源时任务的表现,你不知道他什么时候被阻塞(pend),也就不能确切 的知道他什么时候恢复阻塞。而且挂起队列在操作系统里可以看成一个,而阻塞队列则是不同的事件或资源(如信号量)就有自己的队列;
  二:阻塞(pend)就是任务释放CPU,其他任务可以运行,一般在等待某种资源或信号量的时候出现。挂起(suspend)不释放CPU,如果任务优先级高就永远轮不到其他任务运行,一般挂起用于程序调试中的条件中断,当出现某个条件的情况下挂起,然后进行单步调试;
  三:pend是task主动去等一个事件,或消息.suspend是直接悬挂task,以后这个task和你没任何关系,任何task间的通信或者同步都和这个suspended task没任何关系了,除非你resume task;
  四:任务调度是操作系统来实现的,任务调度时,直接忽略挂起状态的任务,但是会顾及处于pend下的任务,当pend下的任务等待的资源就绪后,就可以转为ready了。ready只需要等待CPU时间,当然,任务

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值