μC/OS-II在ARM平台上移植的深入探讨
4 S3C2410启动代码和μC/OS-II的融合
本文1.1节已经介绍过,S3C2410的启动代码开始部分是汇编语言的初始化过程,然后跳转到main()函数。融合的工作就从改造S3C2410的main()函数和μC/OS-II的main()函数(在test.c中)开始。在S3C2410的main()函数中,保留原启动代码中关于端口、内存、外部设备初始化代码,删去跳转到Linux操作系统的代码;在μC/OS-II的test.c文件的main()函数中,删去一切与X86内核有关的初始化代码和输入输出函数代码(因为这部分代码在S3C2410的启动代码中已经实现),并将与 μC/OS-II内核有关的3个函数OSInit()、OSTaskCreate(…)、OSStart()复制到S3C2410的main()函数中,同时删去μC/OS-II的test.c文件。融合后的main()函数主要代码如下:
ChangeClockDivider(1, 1); //1:2:4
ChangeMPllValue(161,3,1); //FCLK=203.0 MHz
SetClockDivider(1, 1);
SetSysFclk(FCLK_203M);
Port_Init();
Isr_Init();
Uart_Init(0, 115200);
Uart_Select(0);
MMU_Init(); //MMU 初始化
EnableModuleClock(CLOCK_ALL);
rMISCCR = ~(0x3007);
OSInit();
OSTaskCreate(TaskStart,……, 0);
OSStart();
至此,处理器已执行完S3C2410的启动代码,并开始执行μC/OS-II内核代码。当然,要实现多任务,处理器的中断必须是打开的。这个工作在OSStart ()函数中完成,在执行OSStartHighRdy之前,要按照系统的需求完成处理器的中断初始化工作,同时打开中断。至此,融合工作基本完成,剩下的工作就是按照系统的需求在μC/OS-II的TaskStart(…)函数中自由添加实际工作所需的任务了。
在本文所述系统中,在μC/OS-II所带3个系统任务的基础上添加了3个任务Task1、Task2和Task3,方法是在OSStatInit( )之前添加OSTaskCreate(Task1,…)等代码,然后按下述格式和自己的需求编写Task1、Task2和Task3函数。代码为:
void Task1(void *data)
{
while(1) { ;任务代码 }
}
因篇幅所限,无法详述在融合过程中遇到的所有问题,尤其是在ADSv1.2环境下编译、调试过程出现的语法问题和各种细节问题。
随着科技的发展和实际任务复杂性的逐步增加,传统的单片机前后台编程模式渐渐不能满足实际应用的要求。在嵌入式应用开发中使用嵌入式操作系统已经成为一种趋势,本文在S3C2410开发板上将原有的引导程序和μC/OS-II操作系统结合在一起,开发出能自引导的μC/OS-II操作系统,该系统除了3个系统任务外,还自带3个实际任务,在ADSV1.2环境下编译、调试,并在板卡上成功运行,对μC/OS-II在ARM平台上的移植有一定借鉴意义。
参考文献
[1] 任哲,潘树林,房红征,编著.嵌入式操作系统基础 μC/OS-II和Linux[M].北京:北京航空航天大学出版社,
2007.
[2] 韩山,郭云,付海艳,编著.ARM微处理器应用开发技术详解与实例分析[M].北京:清华大学出版社,2007:284-286.
[3] 蒋维. 基于ARMS3C2410嵌入式系统的Bootloader分析与设计[J].电子工程师,2008(10).本文引用地址://m.amcfsurvey.com/article/151716.htm
tcp/ip相关文章:tcp/ip是什么
评论