Chinaunix首页 | 论坛 | 博客
  • 博客访问: 804807
  • 博文数量: 281
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2770
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-02 19:45
个人简介

邮箱:zhuimengcanyang@163.com 痴爱嵌入式技术的蜗牛

文章分类
文章存档

2020年(1)

2018年(1)

2017年(56)

2016年(72)

2015年(151)

分类: 嵌入式

2017-09-01 15:05:31

问题1:什么是可剥夺型内核和不可剥夺型内核?       
 不可剥夺型内核:要求每个任务主动放弃cpu。各个任务彼此合作共享一个cpu,异步事件还是由中断服务来处理的。中断服务可使一个高优先级的任务由挂起变为就绪状态,但是中断服务后,使用权就回到了被中断了的那个任务,也就是回到了原来的任务了,直到该任务主动放弃cpu的使用权,此时高优先级的任务才能或得cpu使用权。其优点:1:响应中断快;2:几乎不需要使用信号量来保护共享数据,当前运行着的任务占用着cpu,而不必担心被别的任务占了,但是某些时候还是要用信号量的,比如说在处理共享的io设备时,仍然要用互斥型信号量。缺点:响应时间,高优先级的任务已经进入就绪状态,但是还是不能运行,因为此时cpu依然被原来的任务占有,要等到原来的程序结束或者其让出cpu使用权,这之间的时间不能确定,也许很长时间。所以不可剥夺型内核的任务级响应时间是无法确定的,这也就导致最高优先级获得cpu的使用权完全取决于霸占CPU的程序何时释放cpu了。

总之,不可剥夺型内核允许每个任务运行,直到该任务自愿放弃cpu的使用权,中断可以打断运行的任务,但是中断服务完成之后,cpu还是回到原来的任务,任务级的响应要大大好于前后台系统,但是时间仍然是不能确定的,所以不可剥夺型内核是不能用在商业软件中的。

可剥夺型内核:系统响应很重要时就不能使用不可剥夺内核了,就要使用可剥夺型内核了,当最高优先级的任务一旦就绪总能得到cpu的使用权,也就是说当一个运行着的任务使得一个比他优先级高的任务进入就绪状态时,当前的cpu的使用权就被这个高优先级任务抢去了,当前任务就被挂起了,或者是中断服务子程序使一个高优先级的任务进入就绪状态,中断完成时,被中断的任务就被挂起,优先级高的任务开始运行。



问题2. 一个应用程序为什么一定要使用空闲任务?
嵌入式操作系统(ucos)为什么需要空闲任务,任哲的书解释是计算机不能停下来,那问题来了,为什么呢?

几乎任何操作系统都需要有空闲任务。因为CPU(提供CPU级休眠的不算)没办法停下来,尤其是嵌入式系统这一块。CPU停下来的唯一情况就是断电了,而要保持操作系统任何时候都能及时的对外做出响应,就必须有一个任务在那等着,这个任务就是Idle,大部分操作系统上都需要有这个任务。普通的CPU如果停下来,就收不到任何外部中断或者别的东西了,跟死机没区别,所以CPU不能停。当然了,也有能进入省电模式的CPU,这个另说,通用的设计是必须要保留空闲任务的。

作者:北极
链接:
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


问题3: 统计任务是必须使用的吗?
不是。利用统计任务来查看CPU的使用率。

问题4:
小白在学习过程中有时会在程序中看到0u或是0ul等常量有后缀的情况,如果没接触到C语言常量后缀的话可能就有点疑惑~
其中的u为unsigned,l为long,f为float

C语言中常量的默情况:整形默认为有符号int;浮点型默认为double;如果整形常量大小超出int,默认自然就为long int ;如果需要无符号整形常量的话就可以在常量后面加u或是U,如0u或是0U,同理可以在常量后面加ul或UL表示无符号长整形常量;而浮点型常量后缀  有f或F,l或L,没有u或U,因为浮点数一般都为有符号。


问题5:源码中老是用 void *定义一个变量,这有什么作用啊?
void * 指针的用途:
1. 可以预留,以便扩展功能

在UCOS II中事件控制块 ECB 中,定义 OS_EVENT:
typedef struct os_event {
    INT8U    OSEventType;                    /* Type of event control block (see OS_EVENT_TYPE_xxxx)    */
    void    *OSEventPtr;                     /* Pointer to message or queue structure                   */
    INT16U   OSEventCnt;                     /* Semaphore Count (not used if other EVENT type)          */
    OS_PRIO  OSEventGrp;                     /* Group corresponding to tasks waiting for event to occur */
    OS_PRIO  OSEventTbl[OS_EVENT_TBL_SIZE];  /* List of tasks waiting for event to occur                */

#if OS_EVENT_NAME_EN > 0u
    INT8U   *OSEventName;
#endif
} OS_EVENT;


OSEventPtr 定义成 void * 类型,可以实现不同的类型扩展,方便以后升级维护等。



阅读(1004) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~