微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > μC/OS-II在ARM平台上移植的研究

μC/OS-II在ARM平台上移植的研究

时间:01-04 来源:互联网 点击:

3C2410在进入ISR模式后,自动屏蔽ISR中断,所以粗存在中断嵌套,可以表明2个全部变量ISR_LR和ISR_SPSR用于保存ISR中断发生之时处理器的lr和spsr寄存器。其代码的特别之处在于,在ISR中断处理过程中通过修改lr寄存器,而使处理器在退出ISR模式时能根据任务的需要返回至ISR中断发生之处或者代码指定地点。在代码指定地点,可以保存上次中断发生时被中断任务的处理器的所有寄存器数据。这里需要注意一点,当处理器退出ISR模式时跳转到Saveregister处开始执行命令,需要提前将Saveregister处的地址加上4,然后赋值给lr寄存器。因为在ISR退出时,需要将lr减去4再赋值给程序计数器pc。

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) { ;任务代码 }

  }
本文在S3C2410开发板上将原有的引导程序和μC/OS-II操作系统结合在一起,开发出能自引导的μC/OS-II操作系统,该系统除了3个系统任务外,还自带3个实际任务,在ADSV1.2环境下编译、调试,并在板卡上成功运行,对μC/OS-II在ARM平台上的移植有一定借鉴意义。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top