uCOS-Ⅱ源码分析之uC-CPU文件夹

此文共连载分析三个uCOS-Ⅱ的三个源码文件夹:uC-CPU 、uC-LIB 、uCOS-Ⅱ

uC-LIB文件夹目录:
ARM-Cortex-M3 / cpu_a.asm、cpu_c.c、cpu.h
cpu_def.h

cpu_def.h

  • 这个文件中定义了一些 CPU 有关的宏定义,分为三类:

1、CPU 字节长度的定义,理想情况下 CPU 的字长应该是由 sizeof() 函数计算出来的,但是 sizeof() 函数必须在 CPU 运行中才能进行计算,所以在 uCOS 中直接用宏定义定义了出来

#define  CPU_WORD_SIZE_32           4       // 定义 CPU 字节长度为 4 字节

2、CPU 字节顺序的定义,也就是 CPU 的大/小端模式的定义。

#define  CPU_ENDIAN_TYPE_NONE       0       // 不知道是大端模式还是小端模式

#define  CPU_ENDIAN_TYPE_BIG        1       // 大端模式

#define  CPU_ENDIAN_TYPE_LITTLE     2        // 小端模式   

3、临界区的定义和配置,临界区是指一个共用资源的程序片段,但共用资源程序片段一次只能被一个线程占用,当有一个线程正在访问临界区时,其他线程或进程就必须等待,以临界区共用资源的互斥使用(举例:打印机的使用,一个用户正在使用打印机,在未使用完成时,其他用户只能等待前一用户使用完成后才能使用)。

#define  CPU_CRITICAL_METHOD_NONE                  0    // 发生临界区问题是不解决
// 在有线程进入临界区前,暂时禁止中断响应,防止高优先级中断打断正在临界区的线程,在退出临界区时再使能中断
#define  CPU_CRITICAL_METHOD_INT_DIS_EN            1    // 用禁止/使能中断的方法解决临界区问题

#define  CPU_CRITICAL_METHOD_STATUS_STK            2    // 将临界区状态保存在栈中

#define  CPU_CRITICAL_METHOD_STATUS_LOCAL          3    // 将临界区状态保存在局部变量中

cpu.h

  • 核心的就是进入临界区和退出临界区的两个宏

  • 其他的都是一些数据类型重定义和 cpu_c.c 文件中函数的声明
//设置了临界区解决办法,将临界区状态保存在局部变量中
# define  CPU_CFG_CRITICAL_METHOD        CPU_CRITICAL_METHOD_STATUS_LOCAL
//进入临界区前调用这个宏,实现将 CPSR 寄存器备份,然后关闭中断响应
# define  CPU_CRITICAL_ENTER()           { cpu_sr = CPU_SR_Save(); }
//退出临界区后调用这个宏,实现将 CPSR 寄存器还原,中断响应开启
# define  CPU_CRITICAL_EXIT()            { CPU_SR_Restore(cpu_sr); }

cpu_c.c

  • 首先是关于对位带操作的宏定义,定义了 SRAM 内存的位带访问地址范围和外设寄存器的位带访问地址范围。
  • 然后是函数的定义,包括位带清零和置位、使能和禁止 CPU 内部中断源、设置和读取中断源的优先级的函数,这些函数的实现都用到了 NVIC 模块的设置寄存器的位定义和进入/退出临界区时的两个设置宏。
  • uCOS-Ⅱ 中的临界区解决办法用的全部都是 #define CPU_CRITICAL_METHOD_STATUS_LOCAL 这一种办法,其他两个办法没有使用。
  • 其中存储 CPSR 寄存器的局部变量是 CPU_SR 类型的 cpu_sr,这个局部变量是配合进入/退出临界区的两个配置宏进行使用的,看到这个变量定义,后面一定就用到了临界区的操作。

cpu_a.asm

文件中用 EXPORT 导出了多个函数,定义了一些汇编语言书写的函数:

    EXPORT  CPU_IntDis      // 全局中断的禁止
    EXPORT  CPU_IntEn       // 全局中断的使能

    EXPORT  CPU_SR_Save     // 将 CPSR 寄存器内容保存到 R0 寄存器中,然后禁止全局中断
    EXPORT  CPU_SR_Restore  // 将 R0 寄存器内容恢复到 CPSR 寄存器中

    EXPORT  CPU_CntLeadZeros    // 前导零计数
    EXPORT  CPU_RevBits         // 二进制层面取反,  1010 ---> 0101

    EXPORT  CPU_WaitForInt      // CPU 立即进入睡眠模式,等待中断唤醒
    EXPORT  CPU_WaitForExcept   // CPU 进入睡眠模式,等待异常唤醒

转载于:https://blog.51cto.com/ypb39155/2097523

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UCOS-Ⅱ是嵌入式实时操作系统,它适用于各种嵌入式系统的移植和应用。在MC9S12XS128上,UCOS-Ⅱ的移植需要做以下几个步骤。 首先,需要根据MC9S12XS128的处理器架构和硬件资源进行配置。UCOS-Ⅱ提供了针对不同处理器架构的移植文件,可以根据MC9S12XS128的特点进行选择。配置包括时钟源、中断处理等设置,确保UCOS-Ⅱ能够正确运行。 其次,需要将UCOS-Ⅱ的源代码添加到工程中进行编译。UCOS-Ⅱ的源代码可以从官方网站上获得。在编译过程中,需要根据实际情况选择适合MC9S12XS128的编译选项和链接脚本。确保编译生成与MC9S12XS128兼容的可执行文件。 接下来,需要根据具体应用的需求进行UCOS-Ⅱ的配置。UCOS-Ⅱ提供了丰富的配置选项,可以根据应用的实际需求进行选择。配置包括任务数量、任务优先级、任务堆栈大小等参数的设置。通过这些配置,可以实现对系统行为的精确控制。 最后,需要在应用程序中调用UCOS-Ⅱ的相关函数,实现任务的创建、释放、切换等操作。UCOS-Ⅱ提供了一系列API函数,可以方便地进行任务管理、时间管理、内存管理等操作。通过调用这些函数,可以实现对系统资源的充分利用和合理调度。 在MC9S12XS128上的应用中,UCOS-Ⅱ可以发挥其实时性和可靠性的优势。通过合理的任务划分和优先级设置,可以实现对多个任务的并发执行。同时,UCOS-Ⅱ的中断处理机制可以保证在中断发生时能够及时响应,并快速切换任务。这样可以提高系统的响应速度和实时性,适用于需要高实时性的应用场景,如工业控制、汽车电子等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值