ucos系统和linux系统(嵌入式操作系统UC/OSII bc45编译ucos-II的过程)
嵌入式操作系统UC/OSII bc45编译ucos-的过程 摘要:嵌入式系统的应用和发展是继桌面系统和网络技术之后信息产业和信息技术的又一重大发展。虽然对是一个相对小规模的系统,但UC/OSII由于其强大的实时性、开放的内核、稳定的系统以及易于学习和开发而受到技术人员和嵌入式爱好者的青睐。以UC/OSII为例,介绍了嵌入式实时操作系统uC/OS-II在嵌入式平台上的移植程序和方法。 关键词:嵌入式。统一通信/综合信息系统;实时操作系统;发展进程;移植 c/OS-
摘要:嵌入式系统的应用和发展是继桌面系统和网络技术之后信息产业和信息技术的又一重大发展。虽然对是一个相对小规模的系统,但UC/OSII由于其强大的实时性、开放的内核、稳定的系统以及易于学习和开发而受到技术人员和嵌入式爱好者的青睐。以UC/OSII为例,介绍了嵌入式实时操作系统uC/OS-II在嵌入式平台上的移植程序和方法。
关键词:嵌入式。统一通信/综合信息系统;实时操作系统;发展进程;移植 c/OS-
1导言
在日常生活和其他领域,流行的嵌入式操作系统有linux、wince、UC/OSII等。中国正在成为世界电子制造业的重要基地之一,对对嵌入式系统技术及相关技术人才的需求巨大
2 uC/OS-II移植程序
将 c/OS-移植到不同的处理器上。移植就是让实时内核在微处理器或微控制器上运行。
要使 C/OS-正常运行,处理器必须满足以下要求:
1.处理器的c编译器可以生成可重入代码。
中断可以用C语言打开和关闭。
处理器支持中断,并能产生定时中断(通常在10赫兹和100赫兹之间)。
该处理器支持一个硬件堆栈,可以容纳一定数量的数据(可能只有几个)。
处理器具有将堆栈指针和其他中央处理器寄存器读取和存储到堆栈或内存中的指令。
摩托罗拉6805系列等处理器不能满足上述第4条和第5条的要求,因此 C/OS-不能在这些处理器上运行。
迁移工作包括以下内容:
用#define设置一个常量的值。h)
声明10种数据类型。h)
用#define声明三个宏。h)
用C语言写六个简单的函数
编写四个汇编语言函数
一旦代码迁移完成,下一步就是测试。
51单片机移植3 UCOS
当任务函数包含形式参数和局部变量时,如果使用可重入关键字,将导致重入。从C51.PDF 129-131页的内容可知,对于函数再入,形式参数和局部变量必须存储在堆栈中。由于硬件堆栈51太小,KEiL将根据内存模式在相应的内存空间中模拟堆栈(增长方向是从上到下,与硬件堆栈相反)。对以大模式编译,函数的返回地址保存在硬件堆栈中,参数和局部变量放在模拟堆栈中,堆栈指针是?当C_XBP和XBPSTACK=1时,启动时起始值被初始化为FFFFH 1。a51
为了支持再入,重新设计了堆栈结构。添加指针以保存模拟堆栈?C_XBP和堆栈内容的数据结构。相应改变的文件有:操作系统、中央处理器、操作系统、中央处理器。YY。建议使用固定大小的统一堆栈空间。尽管uCOSII的原始作者认为使用不同空间的不同任务是一种优势,但是为了在51上有效地实现任务重入,这种优势仍然没有被利用。
可以准确计算用户堆栈空间的大小。用户堆栈空间=硬件堆栈空间模拟堆栈空间。硬件堆栈占用内部内存,执行效率高。如果堆栈空间太大,会影响KEIL编译的程序性能。如果堆栈空间很小,当嵌套和程序调用被中断时,系统将崩溃。综合考虑,硬件堆栈空间的大小可以设置为64字节,用户可以根据实际情况进行设置。模拟堆栈大小取决于参数和局部变量的类型和数量,并且可以精确计算。因为所有用户堆栈使用相同的空间大小,所以占用最大空间的任务函数的空间大小被视为模拟堆栈空间大小。这样,用户堆栈空间的大小是唯一确定的。用户堆栈空间大小用宏可以在操作系统_CFG中定义。宏名是MaxStkSize。
51的SP只有8位,所以它不能在64K空间自由移动,所以它必须采用复制所有硬件堆栈内容的愚蠢方法。51本来就很弱,所以缺点更明显。事实上,操作系统的引入必然要付出代价。一般来说,操作系统占用了10%-20%的CPU负载能力,这需要通过权衡利弊来决定。开关频率决定了中央处理器的成本。频率越高,成本就越大。在某种程度上,是时候换一个更强的中央处理器了。我选择了50Hz的开关频率,不高也不低,用户可以根据自己的需要自行决定。
嵌入式开发平台移植4 C/OS-II的一般方法和技巧
选择系统平台和开发工具后,移植C/OS-II一般需要遵循以下步骤:
深入了解所采用的系统核心
分析C语言开发工具的特点
编写移植代码
测试移植
根据对项目的开发平台,打包服务功能(类似于80x86版本的PC机。c和PC。h)
系统核心
无论项目中使用的系统核心是单片机、数字信号处理器还是微处理器,移植C/OS-II时需要注意的细节是相似的。
首先,是芯片的中断处理机制,如何打开和屏蔽中断,以及之前的中断状态是否可以保存。此外,芯片是否有软中断或陷阱指令,以及如何触发它。
另外,我们应该注意系统对,的内存使用机制,比如内存的地址空间,堆栈的增长方向,是否有批量推送堆栈的指令。
工厂代码
在深入了解系统核心和开发工具的基础上,编写移植代码的实际工作比对简单
C/OS-II的大部分代码都是用ANSI C编写的,代码的层次结构非常清晰。平台相关的移植代码只存在于三个文件中:操作系统、中央处理器和中央处理器。H
在移植的时候,结合前面两步已经掌握的信息,基本上遵循《嵌入式实时操作系统C/OS-II》书中相关章节的说明。
然而,由于系统核心和开发工具的多样性,在实际项目中,通常会有一些不同的处理方法,需要特别注意。以C6711的移植为例:
中断打开和屏蔽的两个宏观定义是:
#定义操作系统_输入_临界()禁用_整数()
#定义操作系统退出临界()启用整数()
Disable_int和Enable_int是用汇编语言编写的两个函数。这里使用了控制状态寄存器(CSR) ——的一个特性。除了用于控制全局中断的GIE位之外,还有一个PGIE位,可用于保存先前的GIE状态。
因此,在Disable_int中,首先将GIE的值写入PGIE,然后写入GIE 0以屏蔽中断。在Enable_int状态下,该值从PGIE中读出并写入GIE,从而恢复到之前的中断设置。
这样,我们可以避免使用这两个宏意外地改变系统的中断状态。此外,我们不使用堆栈或局部变量,这比原作者推荐的方法要好。任务切换:
前文说,C6711中没有软中断机制,所以任务切换需要通过用汇编语言编写一个函数来实现,而C6711中需要堆栈保护的#define OS_TASK_SW()寄存器包括A0-A15、B0-B15、CSR、IER、IRP和AMR,它们与当前的程序地址构成一个
在_ OSCtxSw函数中,需要将上述存储帧堆叠起来,就好像发生了中断一样,然后获取被激活任务的TCB指针,并弹出其存储帧的内容,从而完成任务切换。
应该注意的是,操作系统任务软件在这里是作为一个函数被调用的,所以正如前文,所描述的,调用时的当前程序地址存储在B3寄存器中,这是任务被重新激活时的返回地址。
中断的书写:
正如前文所说,如果用关键字“中断”声明一个函数,CCS会自动将函数中使用的寄存器放在堆栈上,并在编译时保护它们不受堆栈影响。然而,这将导致各种各样的中断,例如当它发生时,堆栈内外的内容是不同的。这个对将在C/OS-II中引起严重的错错误。因为C/OS-II需要中断的堆叠操作,当它碰巧使用与当任务切换发生时完全相同的存储器帧结构时。
因此,在基于C/OS-II进行移植或开发时,不应该使用“中断”这个关键字,但是中断函数应该按照以下结构编写:
无效字符(无效)
{
数字信号处理器_ C6x _保存();//服务功能,堆叠
奥斯滕特();
如果新添加了(OsintInstisting==1)//v 2.51
{
OSTCBCur-OSTCBStkPtr
=(操作系统_STK*)数字信号处理器_ C6x _ GetCurrentSP();//服务功能
}//获取当前服务点的值
//允许中断嵌套,然后在这里打开中断。
OSTimeTick();
ointextit();
数字信号处理器_ C6x _恢复();//服务功能,堆栈
{}
DSP_C6x_Save和DSP_C6x_Resume是两个服务函数,分别完成中断的栈出和栈入操作。它们与操作系统任务软件功能的不同之处在于,中断发生时的当前程序地址自动存储在IRP寄存器中,并应视为任务返回地址,而不是B3。此外,DSP_C6x_Resume是一个永远不会返回的函数。在所有内容被推出堆栈后,它会在中断发生前直接跳回程序地址,并继续执行。
测试移植
写完所有移植代码后,我们可以编写几个简单的测试任务程序,可以分为三个步骤。相关信息很详细,所以我就不在这里详述了。
封装服务功能
这最后一步经常被忽略,但是对在保持项目代码简单和易于维护方面具有重要意义。
C/OS-II的原始作者强烈建议源代码应该存储在不同的路径中,
5.结论
C/OS-II具有自由、简单、高可靠性和实时性好的优点,但也存在缺乏方便的开发环境的缺点,尤其是它没有像商用嵌入式系统那样得到广泛的应用和不断的研究与更新。然而,开放性允许开发人员自己剪切和添加所需的功能,这在许多应用领域中发挥着独特的作用。当然,是否在单片机系统中嵌入C/OS-II取决于开发的项目。对于一些简单和低成本的项目,没有必要使用对