rtos 理解

发布时间 2023-07-25 21:46:58作者: lance9527

1:

操作系统中挂起(suspend)和阻塞(pend/block)的区别如下:
一:挂起是一种主动行为,因此恢复也应该要主动完成;而阻塞则是一种被动行为,是在等待事件或资源时任务的表现,你不知道他什么时候被阻塞(pend),也就不能确切知道他什么时候恢复阻塞。而且挂起队列在操作系统里可以看成一个,而阻塞队列则是不同的事件或资源(如信号量)就有自己的队列;
二:阻塞(pend)就是任务释放CPU,其他任务可以运行,一般在等待某种资源或信号量的时候出现。挂起(suspend)不释放CPU,如果任务优先级高就永远轮不到其他任务运行,一般挂起用于程序调试中的条件中断,当出现某个条件的情况下挂起,然后进行单步调试;
三:pend是task主动去等一个事件(信号量/锁)或消息;suspend是直接悬挂task,以后这个task和你没任何关系,任何task间的通信或者同步都和这个suspended task没任何关系了,除非你主动 resume task;
四:任务调度是操作系统来实现的,任务调度时,直接忽略挂起状态的任务,但是会顾及处于pend状态的任务,当pend下的任务等待的资源就绪后,就可以转为ready了。ready只需要等待CPU时间,当然,任务调度也占用开销,但是不大,可以忽略。可以这样理解,只要是挂起状态,操作系统就不在管理这个任务了;
五:挂起是主动的,一般需要用挂起函数进行操作,若没有resume的动作,则此任务一直不会ready。而阻塞是因为资源被其他任务抢占而处于休眠态。两者的表现方式都是从就绪态里“清掉”,即对应标志位清零,只不过实现方式不一样

操作系统中挂起、睡眠、阻塞的区别形象解释:
你控制了一个雇工为你干活。你对雇工的控制是通过编程来实现的。
挂起的意思就是你对主动对雇工说:“你睡觉去吧,用着你的时候我主动去叫你,然后接着干活”。
睡眠的意思就是你主动对雇工说:“你睡觉去吧,某时某刻过来报到,然后接着干活”。
阻塞的意思就是,你发现你的雇工不知道在什么时候没经过你允许,自己睡觉呢,但是你不能怪雇工,肯定你这个雇主没注意,本来你让雇工扫地,结果扫帚被偷了或被邻居家借去了,你又没让雇工继续干别的活,他就只好睡觉了。雇工一旦发现扫帚回来了,他就会自己去干活的。

2:

1、所有的单片机包括计算机的CPU,都得只认识机器码(0和1的二进制串)!!!这是学计算机必须认知的基础。
2、单片机的每条指令的机器码串是不便理解的,例如:“00010100”它是什么意思呢?
在51系统中,它是将A寄存器减1,于是就用一句宜懂的:“DEC A”语句代替“00010100”,“DEC A”就是一句汇编语言。
3、汇编语言的特点是,每一句都对应一个或一串机器码!
4、由于计算机只认识机器码,并不认识汇编语言,所以程序运行前,需要有“人”做翻译,翻译成机器码,这就叫着汇编。
由于汇编语言的每一句都对应一个或一串机器码!所以汇编的翻译很方便。
这个做翻译的“人”当然让一个平台(程序)来完成了,如:KELL!
5、如果“平台”仅仅只做一个对应,也就太简单了,查个对应表就可以了,傻子也能行。
人们在写汇编程序时也总有一些更高级的想法。例如:程序中20个地方会用到“45”这个参数,但有也可能需将它改为“33”,
这对汇编来说很麻烦,要改20个地方。考虑到“平台”这个翻译功能很强大,于是就让“平台”来干这个活,但你总要告诉平台你的意图吧。
你是想用:XYZ来代替20个“45”,于是写程序时就将20处“45”写成“XYZ”,再写一句“XYZ EQU 45”来告诉“平台”翻译的时候所有的有“XYZ”的地方翻译成“45”,
这样如果你要将“45”改为“33”,你只要改一处地方就行了,就是“XYZ EQU 33”,余下的事让“平台”去做!
这个语句是违反汇编原则的,它不对应任何一个机器码,不能直接反汇编,但它很有用,是通过“平台”起作用的。
这就是伪指令!伪指令是不能直接反汇编的,它是需要通过“平台”来翻译程序员的目的,它是针对“平台”的。
所以,一条“伪指令”是什么意义,只有“平台”这个翻译知道,如果平台是“KELL”就必须看“KELL”使用说明,这样就能弄清楚“伪指令”的含义了!
记住:所有的、最终的目的都将程序员写的程序,变成计算机所能认识的机器。
更有甚哉!为了发恢平台的强大智能,将整段整段的汇编语言组合在一起,用一句话一个语句来表示,甚至都看不到汇编的影子了,这就是C语言。
更有高招!将整段整段的C组合在一起,用一句话来表示,这就是高级语言,如VB、JAVA等……。
但无如何,要使计算机能运行,翻译成“机器码”,这是根本!

3:

os_delay(portMAX_DELAY):当延时值为MAX时,此延时将转别为挂起函数,即即使真的延时了portMAX_DELAY这么久,任务也不会被唤醒;而如果将延时值设为portMAX_DELAY-1,则真延时portMAX_DELAY-1这么久后,任务会被唤醒