20190609学习日记

本文详细介绍了μC/OS-II操作系统中的任务管理,包括任务的创建、删除、挂起与恢复,以及任务调度、延时函数、事件控制块和信号量、邮箱、消息队列等通讯机制。此外,还讨论了文件操作,如FATFS文件系统的使用,如打开、读取、写入和管理文件与目录。内容深入浅出,适合嵌入式系统开发者参考。
摘要由CSDN通过智能技术生成

#2019.6.6
#UCOSII Learning… …(continue)
#三、内核结构
##1.临界段

UCOSII为了处理临界段代码需要关中断,处理完毕后在开中断,能够避免同时有其他任务或中断服务进入临界段代码。两个宏的调用分别是:OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL().
##2.任务
一个任务通常是一个无限的循环,一个任务看起来像其他c的函数一样,有函数返回类型,有形参变量,但是任务是绝不会返回的。
用户在建立一个任务的时候,将任务的起始地址与其他参数一起传给下面两个函数中的一个:OSTASTCREAT或OSTAKSCREATEXT()
##3.任务状态
把任务交给UCOSII是用过调用下面两个函数之一:OSTaskCreate()或OSTaskCreateExt(),当任务一旦建立,这个任务就进入就绪态准备运行。
一个任务可以通过调用OSTaskDel()返回到睡眠态,或通过调用该函数让另一个任务进入睡眠态。
调用OSStart()可以启动多任务
正在运行的任务调用两个函数之一将自身延时一段时间,OSDTimeDly()或OSDTimeDlyHMSM()。这个任务于是进门如等待状态,等待这段时间过去,下一个优先级最高的并进入就绪态的任务立刻被赋予CPU的控制权。等待时间过去以后,系统服务函数OSTimeTick()是延时了的任务进入就绪态。
正在运行的任务期待某一时间发生时也需要等待,手段时调用以下三个函数之一:OSSemPend()OSMbosPend()OSQPend()调用后任务进入等待状态。
正在运行的任务是可以被中断的,除非该任务将中断关了,或者μC/OS-Ⅱ将中断关了。被中断了的任务就进入了中断服务态(ISR)。响应中断时,正在执行的任务被挂起,中断服务子程序控制了CPU的使用权。中断服务子程序可能会报告一个或多个事件的发生,而使一个或多个任务进入就绪态。在这种情况下,从中断服务子程序返回之前,μC/OS-Ⅱ要判定,被中断的任务是否还是就绪态任务中优先级最高的。如果中断服务子程序使一个优先级更高的任务进入了就绪态,则新进入就绪态的这个优先级更高的任务将得以运行,否则原来被中断了的任务才能继续运行。
##4.任务控制块
一旦任务建立了,任务控制块OS_TCBs将被赋值。当任务的CPU使用权被剥夺时,μC/OS-Ⅱ用它来保存该任务的状态。当任务重新得到CPU使用权时,任务控制块能确保任务从当时被中断的那一点丝毫不差地继续执行。
OSTCBStkPtr是指向当前任务栈顶的指针。
OSTCBExtPtr 指向用户定义的任务控制块扩展。
OSTCBStkBottom是指向任务栈底的指针。
OSTCBStkSize存有栈中可容纳的指针元数目而不是用字节(Byte)表示的栈容量总数。
OSTCBEventPtr是指向事件控制块的指针,
OSTCBMsg是指向传给任务的消息的指针。
OSTCBStat是任务的状态字。
OSTCBPrio是任务优先级。
##5.任务调度
任务级的调度是由函数OSSched()完成的。中断级的调度是由另一个函数OSIntExt()完成的。
##3.6给调度器上锁和开锁(Locking and UnLocking the Scheduler)
给调度器上锁函数OSSchedlock()用于禁止任务调度,直到任务完成后调用给调度器开锁函数OSSchedUnlock()为止。调用OSSchedlock()的任务保持对CPU的控制权,尽管有个优先级更高的任务进入了就绪态。然而,此时中断是可以被识别的,中断服务也能得到(假设中断是开着的)。OSSchedlock()和OSSchedUnlock()必须成对使用。
当低优先级的任务要发消息给多任务的邮箱、消息队列、信号量时,用户不希望高优先级的任务在邮箱、队列和信号量没有得到消息之前就取得了CPU的控制权,此时,用户可以使用禁止调度器函数。
##3.7空闲任务(Idle Task)
μC/OS-Ⅱ总是建立一个空闲任务,这个任务在没有其它任务进入就绪态时投入运行。这个空闲任务[OSTaskIdle()]永远设为最低优先级,即OS_LOWEST_PRI0。空闲任务OSTaskIdle()什么也不做,只是在不停地给一个32位的名叫OSIdleCtr的计数器加1,统计任务使用这个计数器以确定现行应用软件实际消耗的CPU时间。
##3.8时钟节拍
用户必须在多任务系统启动以后再开启时钟节拍器,也就是在调用OSStart()之后。换句话说,在调用OSStart()之后做的第一件事是初始化定时器中断。
##3.9μC/OS-Ⅱ初始化
在调用μC/OS-Ⅱ的任何其它服务之前,μC/OS-Ⅱ要求用户首先调用系统初始化函数OSIint()。OSIint()初始化μC/OS-Ⅱ所有的变量和数据结构.
OSInit()建立空闲任务idle task,这个任务总是处于就绪态的。空闲任务OSTaskIdle()的优先级总是设成最低,即OS_LOWEST_PRIO。
##3.10μC/OS-Ⅱ的启动
多任务的启动是用户通过调用OSStart()实现的。然而,启动μC/OS-Ⅱ之前,用户至少要建立一个应用任务



#四、任务管理
##1.建立任务,OSTaskCreate()

任务可以在多任务调度开始前建立,也可以在其它任务的执行过程中被建立。在开始多任务调度(即调用OSStart())前,用户必须建立至少一个任务。任务不能由中断服务程序(ISR)来建立。
用户在调用OSTaskCreate()的时候必须知道堆栈是递增的还是递减的(参看所用处理器的OS_CPU.H中的OS_STACK_GROWTH),因为用户必须得把堆栈的栈顶传递给OSTaskCreate(),而栈顶可能是堆栈的最高地址(堆栈从上往下递减),也可能是最低地址(堆栈从下往上长)。
如果OSTaskCreate()函数是在某个任务的执行过程中被调用(即OSRunning置为True),则任务调度函数会被调用来判断是否新建立的任务比原来的任务有更高的优先级。如果新任务的优先级更高,内核会进行一次从旧任务到新任务的任务切换。如果在多任务调度开始之前(即用户还没有调用OSStart()),新任务就已经建立了,则任务调度函数不会被调用。
##2.建立任务,OSTaskCreateExt()
OSTaskCreateExt()需要九个参数!前四个参数(task,pdata,ptos和prio)与OSTaskCreate()的四个参数完全相同。
pbos是指向任务的堆栈栈底的指针,用于堆栈的检验。
stk_size用于指定堆栈成员数目的容量。
pext是指向用户附加的数据域的指针,用来扩展任务的OS_TCB。
opt用于设定OSTaskCreateExt()的选项,指定是否允许堆栈检验,是否将堆栈清零,任务是否要进行浮点操作等等。
##3.任务堆栈
每个任务都有自己的堆栈空间。堆栈必须声明为OS_STK类型,并且由连续的内存空间组成。
##4.删除任务,OSTaskDel()
有时候删除任务是很有必要的。删除任务,是说任务将返回并处于休眠状态。
OSTaskDel()一开始应确保用户所要删除的任务并非是空闲任务,因为删除空闲任务是不允许的。
接着,OSTaskDel()还应确保用户不是在ISR例程中去试图删除一个任务,因为这也是不被允许的
接下来OSTaskDel()会保证被删除的任务是确实存在的
##5.请求删除任务,OSTaskDelReq()
在这种情况下,用户可以想法子让拥有这些资源的任务在使用完资源后,先释放资源,再删除自己。
##6.改变任务的优先级,OSTaskChangePrio()
OSTaskChangePrio()。用户不能改变空闲任务的优先级,但用户可以改变调用本函数的任务或者其它任务的优先级。
##7.挂起任务,OSTaskSuspend()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值