网站导航: 首页 > 设计参考 > 正文 文章搜索
S3C44B0下ucos-ii的移植
 
文章编号:
090105122517
文章分类: 单片机 ARM
点 击:
...
关 键 词: S3C44B0,ucos,移植
文章来源:
网络
摘 要:
要保证ucos II移植到微处理器后能正确运行;处理器需具备如下特性...

    要保证ucos II移植到微处理器后能正确运行;处理器需具备如下特性:
1) 处理器的c编译器支持可重入函数
可重入的代码指的是一段代码(如一个函数)可以被多个任务同时调用,而不必担心会破坏数据。也就是说,可重入型函数在任何时候都可以被中断执行,过一段时间以后又可以继续运行,而不会因为在函数中断的时候被其他的任务重新调用,影响函数中的数据。下面的两个例子可以比较可重入型函数和非可重入型函数:
程序1:可重入型函数

 
  1. void swap(int *x, int *y)   
  2. {   
  3.     int temp;   
  4.     temp=*x;   
  5.     *x=*y;   
  6.     *y=temp;   
  7. }  

程序2:非可重入型函数
 

 
  1. void swap(int *x, int *y)   
  2. {   
  3.     int temp;   
  4.     temp=*x;   
  5.     *x=*y;   
  6.     *y=temp;   
  7. }  


程序1 中使用的是局部变量temp 作为变量。通常的C 编译器,把局部变量分配在栈中。
所以,多次调用同一个函数,可以保证每次的temp 互不受影响。而程序2 中temp 定义的是全局变量,多次调用函数的时候,必然受到影响。代码的可重入性是保证完成多任务的基础,除了在C 程序中使用局部变量以外,还需要C 编译器的支持。笔者使用的是ARM SDT 以及ADS 的集成开发环境,均可以生成可重入的代码。


2)在程序中可以打开和关闭中断
在ucos II中,可以通过OS_ENTER_CRITICAL()或者OS_EXIT_CRITICAL()宏来控制
系统关闭或者打开中断。这需要处理器的支持,在ARM7TDMI 的处理器上,可以设置相应的寄存器来关闭或者打开系统的所有中断。

3)处理器支持中断,并且能产生定时器中断(ucos Ⅱ是通过定时器中断来实现多任务的调度,即时间片的产生 )ucos II 是通过处理器产生的定时器的中断来实现多任务之间的调度的。在ARM7TDMI 的处理器上可以产生定时器中断。

4)处理器要具有一定的硬件堆栈数量
5)处理器要有将堆栈指针和其他cpu寄存器存储和读出堆栈(或者内存)的指令(如51的pop,push指令)。
ucos Ⅱ进行任务调度的时候,会把当前任务的CPU 寄存器存放到此任务的堆栈中,然后,再从另一个任务的堆栈中恢复原来的工作寄存器,继续运行另一个任务。所以,寄存器的入栈和出栈是ucos II多任务调度的基础。
ARM7TDMI 处理器完全满足上述要求。
接下来将介绍如何把ucos Ⅱ移植到Samsung公司的一款ARM7TDMI 的嵌入式处理器——S3C44B0X 上。


ucos II中与处理器有关的代码:os_cpu.h   os_cpu_a.asm  os_cpu_c.c
ucos II的设置 :             os_cfg.h   inludes.h


ucos II在S3C44b0上的移植

1)设置inludes.h中与处理器及编译器有关的代码

 FOR ADS 

 
  1. /**********************************************************************************************************  
  2. *                                                uC/OS-II  
  3. *                                          The Real-Time Kernel  
  4. *  
  5. *                        (c) Copyright 1992-1998, Jean J. Labrosse, Plantation, FL  
  6. *                                           All Rights Reserved  
  7. *  
  8. *                                           MASTER INCLUDE FILE  
  9. *********************************************************************************************************  
  10. */  
  11.   
  12. #include    "os_cpu.h"   
  13. #include    "os_cfg.h"   
  14. #include    "ucos_ii.h"   
  15.   

 

这里未做处理 取默认的数据类型。


FOR SDT

 
  1. /*  
  2. *********************************************************************************************************  
  3. *                                                uC/OS-II  
  4. *                                          The Real-Time Kernel  
  5. *  
  6. *                        (c) Copyright 1992-1998, Jean J. Labrosse, Plantation, FL  
  7. *                                           All Rights Reserved  
  8. *  
  9. *                                           MASTER INCLUDE FILE  
  10. **********************************************************************************************************/  
  11.   
  12. #include    <stdio.h>   
  13. #include    <stdlib.h>   
  14. #include    <string.h>   
  15. #include    "os_cpu.h"   
  16. #include    "os_cfg.h"   
  17. #include    "ucos_ii.h"   
  18.   
  19. #ifdef      EX3_GLOBALS   
  20. #define     EX3_EXT   
  21. #else   
  22. #define     EX3_EXT  extern   
  23. #endif   
  24.   
  25. /*  
  26. *********************************************************************************************************  
  27. *                                             DATA TYPES  
  28. *********************************************************************************************************  
  29. */  
  30.   
  31. typedef struct {   
  32.     char    TaskName[30];   
  33.     INT16U  TaskCtr;   
  34.     INT16U  TaskExecTime;   
  35.     INT32U  TaskTotExecTime;   
  36. } TASK_USER_DATA;   
  37.   
  38. /*  
  39. *********************************************************************************************************  
  40. *                                              VARIABLES  
  41. *********************************************************************************************************  
  42. */  
  43.   
  44. EX3_EXT  TASK_USER_DATA  TaskUserData[10];   
  45.   
  46. /*  
  47. *********************************************************************************************************  
  48. *                                         FUNCTION PROTOTYPES  
  49. *********************************************************************************************************  
  50. */  
  51.   
  52. void   DispTaskStat(INT8U id);  


********************************************************************************

其他人的应用修改事例:

 
  1. #define INT8U unsigned char   
  2. #define INT16U unsigned short   
  3. #define INT32U unsigned long   
  4. #define OS_STK unsigned long   
  5. #define BOOLEAN int   
  6. #define OS_CPU_SR unsigned long   
  7. #define INT8S char   
  8. extern int INTS_OFF(void);   
  9. extern void INTS_ON(void);   
  10. #define OS_ENTER_CRITICAL() { cpu_sr = INTS_OFF(); }   
  11. #define OS_EXIT_CRITICAL() { if(cpu_sr == 0) INTS_ON(); }   
  12. #define OS_STK_GROWTH 1   
  13. #define STACKSIZE 256   

因为不同的微处理器有不同的字长,所以ucos Ⅱ的移植包括了一系列的类型定义以确
保其可移植性。尤其是ucos Ⅱ代码从不使用C 的short,int 和long 等数据类型,因为它们是与编译器相关的,不可移植。相反的,我们定义的整形数据结构既是可移植的又是直观的。为了方便,虽然ucos Ⅱ不是用浮点数据,但我们还是定义了浮点数据类型。
例如,INT16U 数据类型总是代表16 位的无符号整数。现在,ucos Ⅱ和用户的应用程序就可以估计出声明为该数据类型的变量的取值范围是0~65535。将ucos Ⅱ移植到32 位的处理器上也就意味着INT16U 实际被声明为无符号短整形数据结构而不是无符号整数数据结构。但是,μC/OS-Ⅱ所处理的仍然是INT16U。用户必须将任务堆栈的数据类型告诉给μC/OS-Ⅱ。这个过程是通过为OS_STK 声明正确的C 数据类型来完成的。我们的处理器上的堆栈成员是16 位的,所以将OS_TSK 声明为无符号整形数据类型。所有的任务堆栈都必须用OS_TSK 声明数据类型。
2)OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()
与所有的实时内核一样,μC/OS-Ⅱ需要先禁止中断再访问代码的临界区,并且在访问完
毕后重新允许中断。这就使得μC/OS-Ⅱ能够保护临界区代码免受多任务或中断服务例程
(ISR)的破坏。在S3C44B0X 上是通过两个函数(OS_CPU_A.S)实现开关中断的。

 
  1. INTS_OFF   
  2. mrs r0, cpsr ; 当前CSR  
  3. mov r1r0 ; 复制屏蔽  
  4. orr r1r1, #0xC0 ; 屏蔽中断位  
  5. msr CPSR, r1 ; 关中断(IRQ and FIQ)  
  6. and r0r0, #0x80 ; 从初始CSR 返回FIQ 位  
  7. mov pc,lr ; 返回  
  8. INTS_ON   
  9. mrs r0, cpsr ; 当前CSR  
  10. bic r0r0, #0xC0 ; 屏蔽中断  
  11. msr CPSR, r0 ; 开中断(IRQ and FIQ)  
  12. mov pc,lr ; 返回  
 
相关文章:
S3C44B0X的最小系统构架[图]
Blob 在S3C44B0 上的移植
基于S3C44B0的大型LED显示系统设计[图]
ARM MPlayer移植过程
mplayer在S3C2410上的移植
在S3C2410上移植yaffs2文件系统
S3C2410 LCD 驱动程序移植及GUI程序编写[图]
S3C44B0X上的一款Boot Loader解析
ARM SDT汇编格式与GNU汇编格式的移植
S3C44B0 调试笔记—uClinux
S3C44B0 调试笔记-BIOS
在S3C2410上移植bluetooth(蓝牙)
MiniGUI在AT91RM9200开发板上的移植
uboot移植到S3C44B0X开发板的经历
关于三星S3C44B0X目标板的uClinux Bootloader
S3C44b0的中断控制
关于S3C44b0向量中断的疑问
S3C44b0 RTC调试经验
S3C44B0存储器的BANK设计和控制
S3C44B0 寄存器描述
S3c44b0 RTC程序
S3C44b0引导注释
基于S3C44B0X和M12模块的GPS接收终端
ucos WiFi无线网卡驱动程序的开发
uCOS II 的移植
uCGUI 移植到 S3C44B0X的实验
uCOS II在ARM处理器上移植过程中的中断处理
基于uCOS II的MP3文件播放系统设计
提高uCOS-II在ARM上的执行效率

123 下一页
 
最新开源项目
 
 
  查看更多...  
 
本站相关产品   淘宝网店
 




 
  查看更多...  

 

本站程序由百合电子工作室开发和维护
Copyright @ baihe electric studio
渝ICP备09006681号-4