共1条
1/1 1 跳转至页
网友的几个有关uC/OS 的几个问题
消息标题:大家都说你是这方面高手
--------------------------------------------------------------------------------
我刚开始看UC/OS,有如下的问题,希望解答,谢谢!
1、书上说uc/os的任务删除仅仅是不再理会此任务,那么,这个任务占用的系统资源如打开的文件、分配的内存、占用的信号量等,何时释放?
2、书上没有讲到异常处理。那出现异常UC/OS是如何处理的呢?任务占用的系统资源如何释放呢?
3、uc/os的任务之间没有亲缘关系,那么主任务出现异常时子任务如何处理?它们占用的资源呢?
4、在任务不是很多的情况下,用UC/OS的内存管理方式是不是太浪费内存了。我觉得还不如一般malloc算法的效果好,大家觉得呢?
如下是我对uC/OS的理解和对你的回答:
1、任务的删除意味着:a)它的任务控制块从OSTCBList链表中移到OSTCFreeList,这样时钟节拍函数中就不会处理它了,这样调度把它置入就绪表的可能性就没了;b)如果它已经处于就绪表中,那么它将被移出,这样调度器函数就不会处理它,这样它被调度运行的机会就没了;c)如果任务处于邮箱、消息队列、信号量的等代表中,那么一旦条件满足(譬如邮箱接收到一条消息或者信号量被增1),它就有可能被置入就绪表,为此也要把它移出等待表!这些都完成了,任务就不会有机会占用CPU了,但是他的代码并不会被删除[至少目前这个版本不会,如果你让他运行在RAM里面,而且丰富内存处理函数的话,那么可以象Linux那样删除它的代码在RAM中所占用的空间,rom里的不会被删除]。其实任务删除函数做的就是让任务失去调度的可能性,并没有释放它占用的资源并没有释放,为此系统提供了请求删除任务函数,它在可能被删除的任务中被调用,用来释放占用的资源:该任务可能占用那些资源可以从你写的任务代码中看出,所以你该知道怎么去释放,具体格式可参见P117程序清单4.13!
2、我理解的异常处理在uC/OS这样的操作系统应该不会出现吧,因为他的全部代码可以是静态地被装入存储器里运行,并不会出现linux里的页异常请求。其他可能出现地异常应该在编写代码地时候就可以避免:譬如内存分配一块,你可能分配得到一个大小为N byte地内存块,可是后来你却把它当作N word来用,这样的异常是可以避免的。还有的异常可能需要硬件来支持吧,譬如Motorola 68k里面就有一些异常处理中断,这样写一个中断程序来处理异常即可,一般这样的中断处理函数想写好比较难,看了Linux中的某些异常处理函数就知道其构思之奇妙:)
3、就像你说得那样,uC/OS中的任务是没有亲缘关系,即使有也就是:谁被谁创建的、谁被谁删除的关系,即使那样,他们其实都是平等的,因为他们都有机会创建对方、删除对方,这取决于你的代码是怎么写的了。如果你再任务A中创建了任务B,那么任务A就得为任务B申请和提供必要的系统资源:譬如堆栈空间、任务控制块、任务优先级等等。与删除一个人相对立,创建一个任务并没有创建代码,而是给你预先写好的任务B代码提供一个被OS调度的可能性。创建成功之后在任务B就完全独立于A了,A可以删除B,B也可以删除A,至于怎么释放,什么时候释放,可以参照1的说明;
4、对于某些应用来说完全没有必要使用内存分配模块,有些简单的应用就那么几个任务,功能也都是确定,时序关系也都固定,就没有必要使用它了。设计和使用内存管理模块的目的就是为了充分利用系统中的内存,如果任务要求的内存不多,每个任务都可以静态地从系统获得足够地内存,那么就不必动态分配来获取,这样反而会影响实时性。如果系统内存紧张,那么使用内存管理模块就可以把内存虚拟得很大,可以解决系统资源不足的弊端,但这样肯定会影响实时性的。其关键在于权衡。
很长时间没翻那本书了,很多细节都记不得了,我现在在学习使用Ti的DSP/BIOS,也是一个e OS,感觉与uC/OS的思想很相似,如有学习DSP/BIOS的大侠,咱们一起来切磋促进一下吧:)
不知道我的回答能否给你带来帮助,有什么问题,我们共同探讨:)
关键词: 网友 几个 有关 几个问题 任务 删除 内存 异常
共1条
1/1 1 跳转至页