IACMall工业自动化(中国)商城--论坛技术交流专区仪器仪表 嵌入式系统:uC/OS-ii 专题开放!(强烈推荐)

2  /  2  页   12 跳转 查看:131

嵌入式系统:uC/OS-ii 专题开放!(强烈推荐)

嵌入式系统:uC/OS-ii 专题开放!(强烈推荐)

嵌入式系统设计与实例开发-基于ARM处理器与uCOS II实时操作系统.pdf


文档大,需要发Email  给 me!
[aijun9801] 清清嗓子唱起歌来:东方红,太阳升
 

嵌入式系统:uC/OS-ii 专题开放!(强烈推荐)

uC/OS应用的简单剖析


一. uC/OS-II的移植

移植uC/OS对目标处理器有一定要求,这个可以参照<<uc/OS-II源码公开的实时嵌入式操作系统>>一书中第8章的内容.
整个嵌入式系统分为两大层:硬件层和软件层.这里主要研究软件层的架构.
软件层主要分为四个部分:实时操作系统内核,与处理器相关部分,与应用相关部分,用户的应用系统.

l 实时操作系统内核

实时操作系统对系统资源进行管理。主要包括任务分配和调度、系统时钟服务、内存管理、消息机制、异常处理等等。uC/OS所有系统服务均由内核提供。内核将应用系统和底层硬件结合成一个完整的实时系统。
移植的时候内核是不变的,开发者根据自己应用系统的需要来选择实时操作系统内核,开发者不能对内核随意访问,只能使用内核提供的功能服务来开发自己的应用系统。内核确定,那么所提供的系统管理能力,系统服务也就得到了限定。开发者只能在规定的范围内对系统作些改动.

2 与处理器相关的代码

这是移植中最关键的部分.内核将应用系统和底层硬件有机的结合成一个实时系统,要使同一个内核能适用于不同的硬件体系,就需要在内核和硬件之间有一个中间层,这就是与处理器相关的代码.处理器不同,这部分代码也不同.
我们在移植时需要自己处理这部分代码,可以自己编写,也可以直接使用已经成功移植的代码.
在uC/OS中这一部分代码分成三个文件S_CPU.H, OS_CPU_A.ASM, OS_CPU_C.C

1) OS_CPU.H

包括了用#define定义的与处理器相关的常量,宏和类型定义.
具体来讲有系统数据类型定义,栈增长方向定义,关中断和开中断定义,系统软中断的定义等等.

2) OS_CPU_A.ASM

这部分需要对处理器的寄存器进行操作,所以必须用汇编语言来编写.包括四个子函数SStartHighRdy(),OSCtxSw(),OSIntCtxSw(),OSTickISR().
OSStartHighRdy()在多任务系统启动函数OSStart()中调用.完成的功能是:设置系统运行标志位OSRunning = TRUE;将就绪表中最高优先级任务的栈指针Load到SP中,并强制中断返回.这样就绪的最高优先级任务就如同从中断里返回到运行态一样,使得整个系统得以运转.
OSCtxSw()在任务级任务切换函数中调用的.任务级切换是通过SWI或者TRAP人为制造的中断来实现的.ISR的向量地址必须指向OSCtxSw().这一中断完成的功能:保存任务的环境变量(主要是寄存器的值,通过入栈来实现),将当前SP存入任务TCB中,载入就绪最高优先级任务的SP,恢复就绪最高优先级任务的环境变量,中断返回.这样就完成了任务级的切换.
OSIntCtxSw()在退出中断服务函数OSIntExit()中调用,实现中断级任务切换.由于是在中断里调用,所以处理器的寄存器入栈工作已经做完,就不用作这部分工作了.具体完成的任务:调整栈指针(因为调用函数会使任务栈结构与系统任务切换时堆栈标准结构不一致),保存当前任务SP,载入就绪最高优先级任务的SP,恢复就绪最高优先级任务的环境变量,中断返回.这样就完成了中断级任务切换.
OSTickISR()系统时钟节拍中断服务函数,这是一个周期性中断,为内核提供时钟节拍.频率越高系统负荷越重.其周期的大小决定了内核所能给应用系统提供的最小时间间隔服务.一般只限于ms级(跟MCU有关),对于要求更加苛刻的任务需要用户自己建立中断来解决.该函数具体内容:保存寄存器(如果硬件自动完成就可以省略),调用OSIntEnter(),调用OSTimeTick(),调用OSIntExit(),恢复寄存器,中断返回.

3) OS_CPU_C.C

UC/OS中共定义了6个函数在该文件中.但是最重要的是OSTaskStkInit().其他都是对系统内核的扩展时用的.
OSTaskStkInit()是在用户建立任务时系统内部自己调用的,对用户任务的堆栈进行初始化.使建立好的进入就绪态任务的堆栈与系统发生中断并且将环境变量保存完毕时的栈结构一致.这样就可以用中断返回指令使就绪的任务运行起来.
具体的入栈方式要根据不同mcu而定.需要参考用户使用的mcu说明书.同时还要考虑mcu的栈生成方式.这需要根据具体问题来分析,在此不做过多论述.


3 与应用相关的代码

这一部分是用户根据自己的应用系统来定制合适的内核服务功能.包括两个文件S_CFG.H, INCLUDES.H.
OS_CFG.H来配置内核,用户根据需要对内核进行定制,留下需要的部分,去掉不需要的部分,设置系统的基本情况.比如系统可提供的最大任务数量,是否定制邮箱服务,是否需要系统提供任务挂起功能,是否提供任务优先级动态改变功能等等.
INCLUDES.H系统头文件,整个实时系统程序所需要的文件,包括了内核和用户的头文件.


4 用户应用系统

这是整个实时系统的最高层,用户通过利用实时操作系统提供的服务来开发自己的具体程序.


二. 用户应用系统编写的模式


kernel提供给用户一些功能函数,使得用户的系统建立更加方便,但是kernel内部不会处理用户的工作,对于整个系统的具体应用工作还得需要用户自己去考虑,如何利用好这些功能服务函数就成为一个比较重要的问题.

1. main函数的结构

void main (void)
{
初始化系统的硬件;
OSInit();
任务的建立,消息机制的建立;
OSStart();
}
这里需要的是在OSStart()执行之前不得启动中断,硬件系统还不能工作.必须先让软件系统进入工作状态后才行.

2. 中断的结构

ISR:
{
保存处理器寄存器的值;
调用OSIntEnter();

执行用户的工作;
调用OSIntExit();
恢复处理器寄存器的值;
RTI;
}
用户的中断形式和以前一样,没有什么大的变化,仅仅是在原来用户ISR的基础上在固定的位置加了两个函数SIntEnter(), OSIntExit().

3. 各个任务的结构

void YourTask (void)
{
for(;;)
{
用户代码
调用的系统服务
}
}
在任务启动函数执行完后,系统会切换到最高优先级的任务去执行,此时,可以将系统硬件部分的启动放在该任务的最前边,仅仅是启动时执行一次,主要是启动系统的节拍中断,或者一些必须在多任务系统调度后才能初始化的部分,使系统的真正开始工作,达到软件硬件的基本同步.
Void HighestPrioTask(void)
{
OSStartHardware();
For (;;)
{
用户代码
调用的系统服务
}
}
[aijun9801] 清清嗓子唱起歌来:东方红,太阳升
 

嵌入式系统:uC/OS-ii 专题开放!(强烈推荐)

在单片机中嵌入操作系统的利弊


早在20世纪60年代,就已经有人开始研究和开发嵌入式操作系统。但直到最近,它才在国内被越来越多的提及,在通信、电子、自动化等需要实时处理的领域所日益显现的重要性吸引了人们越来越多的注意力。但是,人们所谈论的往往是一些著名的商业内核,诸如VxWorks、PSOS等。这些商业内核性能优越,但价格昂贵,主要用于16位和32位处理器中,针对国内大部分用户使用的51系列8位单片机,可以选择免费的uC/OS-II。


uC/OS-II的特点

  1.uC/OS-II是由Labrosse先生编写的一个开放式内核,最主要的特点就是源码公开。这一点对于用户来说可谓利弊各半,好处在于,一方面它是免费的,另一方面用户可以根据自己的需要对它进行修改。缺点在于它缺乏必要的支持,没有功能强大的软件包,用户通常需要自己编写驱动程序,特别是如果用户使用的是不太常用的单片机,还必须自己编写移植程序。

  2.uC/OS-II是一个占先式的内核,即已经准备就绪的高优先级任务可以剥夺正在运行的低优先级任务的CPU使用权。这个特点使得它的实时性比非占先式的内核要好。通常我们都是在中断服务程序中使高优先级任务进入就绪态(例如发信号),这样退出中断服务程序后,将进行任务切换,高优先级任务将被执行。拿51单片机为例,比较一下就可以发现这样做的好处。假如需要用中断方式采集一批数据并进行处理,在传统的编程方法中不能在中断服务程序中进行复杂的数据处理,因为这会使得关中断时间过长。所以经常采用的方法是置一标志位,然后退出中断。由于主程序是循环执行的,所以它总有机会检测到这一标志并转到数据处理程序中去。但是因为无法确定发生中断时程序到底执行到了什么地方,也就无法判断要经过多长时间数据处理程序才会执行,中断响应时间无法确定,系统的实时性不强。如果使用uC/OS-II的话,只要把数据处理程序的优先级设定得高一些,并在中断服务程序中使它进入就绪态,中断结束后数据处理程序就会被立即执行。这样可以把中断响应时间限制在一定的范围内。对于一些对中断响应时间有严格要求的系统,这是必不可少的。但应该指出的是如果数据处理程序简单,这样做就未必合适。因为uC/OS-II要求在中断服务程序末尾使用OSINTEXIT函数以判断是否进行任务切换,这需要花费一定的时间。

  3.uC/OS-II和大家所熟知的Linux等分时操作系统不同,它不支持时间片轮转法。uC/OS-II是一个基于优先级的实时操作系统,每个任务的优先级必须不同,分析它的源码会发现,uC/OS-II把任务的优先级当做任务的标识来使用,如果优先级相同,任务将无法区分。进入就绪态的优先级最高的任务首先得到CPU的使用权,只有等它交出CPU的使用权后,其他任务才可以被执行。所以它只能说是多任务,不能说是多进程,至少不是我们所熟悉的那种多进程。显而易见,如果只考虑实时性,它当然比分时系统好,它可以保证重要任务总是优先占有CPU。但是在系统中,重要任务毕竟是有限的,这就使得划分其他任务的优先权变成了一个让人费神的问题。另外,有些任务交替执行反而对用户更有利。例如,用单片机控制两小块显示屏时,无论是编程者还是使用者肯定希望它们同时工作,而不是显示完一块显示屏的信息以后再显示另一块显示屏的信息。这时候,要是uC/OS-II即支持优先级法又支持时间片轮转法就更合适了。

  4.uC/OS-II对共享资源提供了保护机制。正如上文所提到的,uC/OS-II是一个支持多任务的操作系统。一个完整的程序可以划分成几个任务,不同的任务执行不同的功能。这样,一个任务就相当于模块化设计中的一个子模块。在任务中添加代码时,只要不是共享资源就不必担心互相之间有影响。而对于共享资源(比如串口),uC/OS-II也提供了很好的解决办法。一般情况下使用的是信号量的方法。简单地说,先创建一个信号量并对它进行初始化。当一个任务需要使用一个共享资源时,它必须先申请得到这个信号量,而一旦得到了此信号量,那就只有等使用完了该资源,信号量才会被释放。在这个过程中即使有优先权更高的任务进入了就绪态,因为无法得到此信号量,也不能使用该资源。这个特点的好处显而易见,例如当显示屏正在显示信息的时候,外部产生了一个中断,而在中断服务程序中需要显示屏显示其他信息。这样,退出中断服务程序后,原有的信息就可能被破坏了。而在uC/OS-II中采用信号量的方法时,只有显示屏把原有信息显示完毕后才可以显示新信息,从而可以避免这个现象。不过,采用这种方法是以牺牲系统的实时性为代价的。如果显示原有信息需要耗费大量时间,系统只好等待。从结果上看,等于延长了中断响应时间,这对于未显示信息是报警信息的情况,无疑是致命的。发生这种情况,在uC/OS-II中称为优先级反转,就是高优先级任务必须等待低优先级任务的完成。在上述情况下,在两个任务之间发生优先级反转是无法避免的。所以在使用uC/OS-II时,必须对所开发的系统了解清楚,才能决定对于某种共享资源是否使用信号量。


uC/OS-II在单片机使用中的一些特点
  1.在单片机系统中嵌入uC/OS-II将增强系统的可靠性,并使得调试程序变得简单。以往传统的单片机开发工作中经常遇到程序跑飞或是陷入死循环。可以用看门狗解决程序跑飞问题,而对于后一种情况,尤其是其中牵扯到复杂数学计算的话,只有设置断点,耗费大量时间来慢慢分析。如果在系统中嵌入uC/OS-II的话,事情就简单多了。可以把整个程序分成许多任务,每个任务相对独立,然后在每个任务中设置超时函数,时间用完以后,任务必须交出CPU的使用权。即使一个任务发生问题,也不会影响其他任务的运行。这样既提高了系统的可靠性,同时也使得调试程序变得容易。

  2.在单片机系统中嵌入uC/OS-II将增加系统的开销。现在所使用的51单片机,一般是指87C51或者89C51,其片内都带有一定的RAM和ROM。对于一些简单的程序,如果采用传统的编程方法,已经不需要外扩存储器了。如果在其中嵌入uC/OS-II的话,在只需要使用任务调度、任务切换、信号量处理、延时或超时服务的情况下,也不需要外扩ROM了,但是外扩RAM是必须的。由于uC/OS-II是可裁减的操作系统,其所需要的RAM大小就取决于操作系统功能的多少。举例来说,uC/OS-II允许用户定义最大任务数。由于每建立一个任务,都要产生一个与之相对应的数据结构TCB,该数据结构要占用很大一部分内存空间。所以在定义最大任务数时,一定要考虑实际情况的需要。如果定得过大,势必会造成不必要的浪费。嵌入uC/OS-II以后,总的RAM需求可以由如下表达式得出:

  RAM总需求=应用程序的RAM需求+内核数据区的RAM需求+(任务栈需求+最大中断嵌套栈需求)�任务数
所幸的是,uC/OS-II可以对每个任务分别定义堆栈空间的大小,开发人员可根据任务的实际需求来进行栈空间的分配。但在RAM容量有限的情况下,还是应该注意一下对大型数组、数据结构和函数的使用,别忘了,函数的形参也是要推入堆栈的。

  3.uC/OS-II的移植也是一件需要值得注意的工作。如果没有现成的移植实例的话,就必须自己来编写移植代码。虽然只需要改动两个文件,但仍需要对相应的微处理器比较熟悉才行,最好参照已有的移植实例。另外,即使有移植实例,在编程前最好也要阅读一下,因为里面牵扯到堆栈操作。在编写中断服务程序时,把寄存器推入堆栈的顺序必须与移植代码中的顺序相对应。

  4.和其他一些著名的嵌入式操作系统不同,uC/OS-II在单片机系统中的启动过程比较简单,不像有些操作系统那样,需要把内核编译成一个映像文件写入ROM中,上电复位后,再从ROM中把文件加载到RAM中去,然后再运行应用程序。uC/OS-II的内核是和应用程序放在一起编译成一个文件的,使用者只需要把这个文件转换成HEX格式,写入ROM中就可以了,上电后,会像普通的单片机程序一样运行。

结语
  由以上介绍可以看出,uC/OS-II具有免费、使用简单、可靠性高、实时性好等优点,但也有移植困难、缺乏必要的技术支持等缺点,尤其不像商用嵌入式系统那样得到广泛使用和持续的研究更新。但开放性又使得开发人员可以自行裁减和添加所需的功能,在许多应用领域发挥着独特的作用。当然,是否在单片机系统中嵌入uC/OS-II应视所开发的项目而定,对于一些简单的、低成本的项目来说,就没必要使用嵌入式操作系统了。
[aijun9801] 清清嗓子唱起歌来:东方红,太阳升
 

嵌入式系统:uC/OS-ii 专题开放!(强烈推荐)

��COS-Ⅱ在AVR上的移植应用



[aijun9801] 清清嗓子唱起歌来:东方红,太阳升





附件:  ��COS-Ⅱ在AVR上的移植应用.PDF (81 K) 下载次数:30
 

嵌入式系统:uC/OS-ii 专题开放!(强烈推荐)

怎样开始学习ucos2(转载)


买了EASYARM2100两个礼拜了,先是花了一个礼拜把全部的代码看完了,感觉也没什么啊,比在学校里面的51还简单。为什么呢??举个简单的例子,51中你如果想控制IIC,就要自己写模拟IIC的软件,而在ARM中,好多控制器都集成好了,你只需要把寄存器配置一下就OK。配置起来很简单,配套光盘里面有用户手册和指令手册,我想有一点单片机基础的人都很容易理解的。用C语言就更不用说了。所以我认为EASYARM对入门者来说还是很好的板子。
其实对于我们电子工程师来说,用汇编,写单片机,并不是什么稀罕事了,即使是使用ARM,也只是多了一些寄存器,指令不太一样罢了,一两天就大部分搞定了。管它是什么核,我们又不是做IC设计的。拿来用就好了。
同样是抱着拿来主意,我开始看ucos2了,ZLG的教材我没怎么看懂,其实是没怎么好好看,一上来就给那么多的函数,头晕~~于是就开始看邵贝贝译的《嵌入式实时操作系统uc\os-ii》了,试着用它里面的四个例子来做实验。虽然说这个实验是基于PC的,但X86也是处理器啊,从外面看和ARM差不多,只是它的配置文件不一样罢了,这个可以以后再看。其实我一直觉得如果你想移植一个操作系统,首先得会用它。就像以前我搞过一段时间ARM+LINUX,但我在PC上还没用过呢,所以后来想想,还是先在PC上用吧。我不知道大家有没有在PC上运行UCOS2,如果没有,赶快试一下吧,你会发现它比你想像中的简单多了!
程序跑起来以后,你再看代码,就会感觉明了很多。很多人对抽象的东西理解不好,我也是这样,我得先看看实际上是怎么回事,才能再去做,呵呵。建议安装一个BORLAND的C编译器,不要告诉我你没有玩过TURBO C 啊~~这样你就可以修改例子的代码了,等于你自己在PC上做UCOS2了。其实如果UCOS2支持的话,你可以下一个在ARM下运行的UCOS2,别人移植好的,你和在PC上一样,去用就是了。
我一直在考虑一个问题,就是现在做嵌入式是需要有电子基础的还是有计算机基础的,至少我从大二以后就没有再用过BORLAND C。可是在做嵌入式编程的时候,很多地方需要C语言。我们不能指望自己把嵌入式的一切都搞定,只有在有限的时间里面,一步一步地把某个方向精通。如果你想搞驱动程序,那就对操作系统了解一点就可以了,重点在芯片结构;如果你想搞操作系统,那就对芯片结构不那么深入了解,重点研究代码吧。不过不排除牛人,什么都搞定,我想拜他为师(人家还不愿意收我呢,呵呵)。
UCOS2的作者发布的四个例子很简单,也很典型,跑起来了以后,对于UCOS2运行起来基本上是什么样子,你也有一个感性的认识了。
所以强烈建议初学者分三步走:
1.先知道ucos2在PC上运行起来是什么样子。
因为ucos2作者给的例子是基于x86的,而且大家对PC的界面都不陌生。大约需要1个小时。有兴趣的话可以读读源码。不过刚开始内核函数肯定不理解了,不过没关系,它的应用程序还是很好理解的。
2.再在PC上添加自己的应用程序。
不用考虑跟CPU有关的代码,而且PC上人机交互比较直观。你可以添加一个自己的小程序,比如把它的在显示器上显示的随机字符改成你的名字,实际操作一下。大约需要2天。然后就要关心一下内核源码了,尤其是内核函数接口一定要知道,内核函数的具体实现方式知道不知道就看你自己的兴趣了。
3.最后再在自己的MCU上移植代码,包括kernel和用户程序。
这时候你的工作只是配置你的ucos2的和CPU相关的文件了,稍微修改一下用户程序。因为ucos2的可移植性很强的。不过这个时期也就是你最重要的时期了,因为你要专心做用户程序,要移植,大约需要一个月。
[aijun9801] 清清嗓子唱起歌来:东方红,太阳升
 

嵌入式系统:uC/OS-ii 专题开放!(强烈推荐)

uC/OS应用的简单剖析


一. uC/OS-II的移植
    移植uC/OS对目标处理器有一定要求,这个可以参照<<uc/OS-II源码公开的实时嵌入式操作系统>>一书中第8章的内容.
    整个嵌入式系统分为两大层:硬件层和软件层.这里主要研究软件层的架构.
    软件层主要分为四个部分:实时操作系统内核,与处理器相关部分,与应用相关部分,用户的应用系统.
    l 实时操作系统内核
      实时操作系统对系统资源进行管理。主要包括任务分配和调度、系统时钟服务、内存管理、消息机制、异常处理等等。uC/OS所有系统服务均由内核提供。内核将应用系统和底层硬件结合成一个完整的实时系统。
      移植的时候内核是不变的,开发者根据自己应用系统的需要来选择实时操作系统内核,开发者不能对内核随意访问,只能使用内核提供的功能服务来开发自己的应用系统。内核确定,那么所提供的系统管理能力,系统服务也就得到了限定。开发者只能在规定的范围内对系统作些改动.
    2 与处理器相关的代码
      这是移植中最关键的部分.内核将应用系统和底层硬件有机的结合成一个实时系统,要使同一个内核能适用于不同的硬件体系,就需要在内核和硬件之间有一个中间层,这就是与处理器相关的代码.处理器不同,这部分代码也不同.
        我们在移植时需要自己处理这部分代码,可以自己编写,也可以直接使用已经成功移植的代码.
        在uC/OS中这一部分代码分成三个文件S_CPU.H, OS_CPU_A.ASM, OS_CPU_C.C
      1)  OS_CPU.H
        包括了用#define定义的与处理器相关的常量,宏和类型定义.
        具体来讲有系统数据类型定义,栈增长方向定义,关中断和开中断定义,系统软中断的定义等等.
      2)  OS_CPU_A.ASM
        这部分需要对处理器的寄存器进行操作,所以必须用汇编语言来编写.包括四个子函数SStartHighRdy(),OSCtxSw(),OSIntCtxSw(),OSTickISR().
        OSStartHighRdy()在多任务系统启动函数OSStart()中调用.完成的功能是:设置系统运行标志位OSRunning =
        TRUE;将就绪表中最高优先级任务的栈指针Load到SP中,并强制中断返回.这样就绪的最高优先级任务就如同从中断里返回到运行态一样,使得整个系统得以运转.
        OSCtxSw()在任务级任务切换函数中调用的.任务级切换是通过SWI或者TRAP人为制造的中断来实现的.ISR的向量地址必须指向OSCtxSw().这一中断完成的功能:保存任务的环境变量(主要是寄存器的值,通过入栈来实现),将当前SP存入任务TCB中,载入就绪最高优先级任务的SP,恢复就绪最高优先级任务的环境变量,中断返回.这样就完成了任务级的切换.
        OSIntCtxSw()在退出中断服务函数OSIntExit()中调用,实现中断级任务切换.由于是在中断里调用,所以处理器的寄存器入栈工作已经做完,就不用作这部分工作了.具体完成的任务:调整栈指针(因为调用函数会使任务栈结构与系统任务切换时堆栈标准结构不一致),保存当前任务SP,载入就绪最高优先级任务的SP,恢复就绪最高优先级任务的环境变量,中断返回.这样就完成了中断级任务切换.
        OSTickISR()系统时钟节拍中断服务函数,这是一个周期性中断,为内核提供时钟节拍.频率越高系统负荷越重.其周期的大小决定了内核所能给应用系统提供的最小时间间隔服务.一般只限于ms级(跟MCU有关),对于要求更加苛刻的任务需要用户自己建立中断来解决.该函数具体内容:保存寄存器(如果硬件自动完成就可以省略),调用OSIntEnter(),调用OSTimeTick(),调用OSIntExit(),恢复寄存器,中断返回.
      3)  OS_CPU_C.C
        UC/OS中共定义了6个函数在该文件中.但是最重要的是OSTaskStkInit().其他都是对系统内核的扩展时用的.
        OSTaskStkInit()是在用户建立任务时系统内部自己调用的,对用户任务的堆栈进行初始化.使建立好的进入就绪态任务的堆栈与系统发生中断并且将环境变量保存完毕时的栈结构一致.这样就可以用中断返回指令使就绪的任务运行起来.
        具体的入栈方式要根据不同mcu而定.需要参考用户使用的mcu说明书.同时还要考虑mcu的栈生成方式.这需要根据具体问题来分析,在此不做过多论述.

    3 与应用相关的代码
        这一部分是用户根据自己的应用系统来定制合适的内核服务功能.包括两个文件S_CFG.H, INCLUDES.H.
        OS_CFG.H来配置内核,用户根据需要对内核进行定制,留下需要的部分,去掉不需要的部分,设置系统的基本情况.比如系统可提供的最大任务数量,是否定制邮箱服务,是否需要系统提供任务挂起功能,是否提供任务优先级动态改变功能等等.
        INCLUDES.H系统头文件,整个实时系统程序所需要的文件,包括了内核和用户的头文件.

    4  用户应用系统
        这是整个实时系统的最高层,用户通过利用实时操作系统提供的服务来开发自己的具体程序.

    二. 用户应用系统编写的模式

    kernel提供给用户一些功能函数,使得用户的系统建立更加方便,但是kernel内部不会处理用户的工作,对于整个系统的具体应用工作还得需要用户自己去考虑,如何利用好这些功能服务函数就成为一个比较重要的问题.
    1. main函数的结构
      void main (void)
      {
        初始化系统的硬件;
        OSInit();
        任务的建立,消息机制的建立;
        OSStart();
      }
      这里需要的是在OSStart()执行之前不得启动中断,硬件系统还不能工作.必须先让软件系统进入工作状态后才行.
    2. 中断的结构
      ISR:
        {
            保存处理器寄存器的值;
            调用OSIntEnter();
            执行用户的工作;
            调用OSIntExit();
            恢复处理器寄存器的值;
            RTI;
        }
      用户的中断形式和以前一样,没有什么大的变化,仅仅是在原来用户ISR的基础上在固定的位置加了两个函数SIntEnter(),
      OSIntExit().
    3. 各个任务的结构
      void YourTask (void)
      {
      for(;;)
      {
      用户代码
      调用的系统服务
      }
      }
      在任务启动函数执行完后,系统会切换到最高优先级的任务去执行,此时,可以将系统硬件部分的启动放在该任务的最前边,仅仅是启动时执行一次,主要是启动系统的节拍中断,或者一些必须在多任务系统调度后才能初始化的部分,使系统的真正开始工作,达到软件硬件的基本同步.
      Void  HighestPrioTask(void)
      {
        OSStartHardware();
        For (;;)
        {
          用户代码
          调用的系统服务
        }
      }
      用户可以按照这些格式去编写自己的任务,建立自己的应用系统
[aijun9801] 清清嗓子唱起歌来:东方红,太阳升
 

嵌入式系统:uC/OS-ii 专题开放!(强烈推荐)

��COS-Ⅱ在AVR上的移植应用


��COS-Ⅱ在AVR上的移植应用(PDF格式),不错的参考资料



描述:��COS-Ⅱ在AVR上的移植应用.PDF
附件:  ��COS-Ⅱ在AVR上的移植应用.PDF (81 K) 下载次数:58
 
2  /  2  页   12 跳转

版权所有 IACMall工业自动化(中国)商城--论坛  IACMall工业自动化(中国)商城  Sitemap

Powered by Discuz!NT 2.1.202    Copyright © 2001-2009 Comsenz Inc.
Processed in 0.078125 second(s) , 3 queries. 闽ICP备07073127号
返顶部