• c8051f020定时器 > uC/OS-II的版本和C8051F020单片机的集成开发环境
  • uC/OS-II的版本和C8051F020单片机的集成开发环境

    免费下载 下载该文档 文档格式:DOC   更新时间:2007-09-02   下载次数:0   点击次数:1
    文档基本属性
    文档语言:Simplified Chinese
    文档格式:doc
    文档作者:USER
    关键词:
    主题:
    备注:
    点击这里显示更多文档属性
    1 uC/OS-II的版本和C8051F020单片机的集成开发环境
    C/OS-II内核使用了V2.52版本.虽然Silicon Lab公司免费提供C8051F系列单片机的集成开发环境,由于使用习惯,笔者还是选择了 Vision2 V2.38A版本,C编译器版本是C51.exe V7.06,汇编器的版本是A51.exe V7.07.适配器使用Silicon Lab公司的EC2,需要说明的是,要在Keil uVision2 IDE中调试C8051F系列单片机,必须安装动态链接库.
    2 uC/OS-II在C8051F020单片机上的移植
    移植工作就是更改OS_CPU.H,OS_CPU_C.C,OS_CPU_A.ASM这几个文件.在说明这几个文件之前,先说明两点注意事项.(1)可重入函数.单片机内部堆栈空间有限,C51提供一种压缩栈的方式,当递归调用这个函数时,会导致变量被覆盖,所以在实时应用中,要用关键字reentrant将函数声明成可重入函数,把每次函数调用时的局部变量单独保存起来.但函数中不可以使用BOOL变量,因为在LARGE编译模式下,KEIL默认将所有变量定位到外部RAM的最高处,而MCS-51系列的MCU中只有内部20H-2FH的地址可以位寻址.(2)C51的关键字和uC/OS-II定义变量的矛盾."pdata","data"在uC/OS-II中用做一些函数的形参,但它同时又是C51的关键字,在编译时导致语法错误,通过把"pdata"改成"ppdata","data"改成"ddata"解决了此问题.
    2.1 OS_CPU.H文件
    这个文件主要是与处理器相关的宏定义和数据类型声明.如前面提到的,不能使用bit型变量,把BOOLEAN型定义成unsigned char型.另外8位MCU数据宽度和堆栈宽度都是8位,分别将OS_STK和OS_CPU_SR定义成unsigned char型.uC/OS-II提供了3种处理临界代码的方法,这里使用第一种,即通过对寄存器EA开关中断.MCS-51系列MCU的堆栈是从下向上递增的,定义OS_STK_GROWTH = 0.
    2.2 OS_CPU_C.C文件
    这个文件主要是完成OSTaskStkInit().在uC/OS-II中,任务是一个无限循环,任务之间也不会互相调用,但是uC/OS-II总是执行优先级最高的任务,假定当前有一个更高优先级的任务进入就绪状态,为了保证原来低优先级任务的完整性,uC/OS-II为每个任务建立了任务堆栈,就相当于函数调用时保存返回地址和参数一样,用来保存当前任务的状态,保证任务切换能和函数调用一样正确.只不过函数调用时函数堆栈的操作过程是编译器自动完成的,而任务切换时需要模拟一个和编译器类似的任务堆栈的操作过程.实际上,uC/OS-II的移植工作主要就是解决这个问题,OSTaskStkInit()完成任务栈初始化,后面介绍的OS_CPU_A.ASM文件完成3种不同条件下的任务切换操作.
    图1列出了应用任务堆栈和MCS-51单片机的系统堆栈结构,左边是MCS-51单片机的系统堆栈,右边是应用任务的堆栈.MCS-51单片机系统堆栈是满递增栈,定义MCS51Sp为系统堆栈指针,定义MCS51SpTop为系统堆栈在内部RAM块的起始地址.初始化时把堆栈指针指向0x60H地址,即MCS51Sp = MCS51SpTop = 0x60H.需要保存的寄存器共有13个,应用任务入栈操作具体过程如下:(1),把所有的寄存器压入系统堆栈;(2),计算系统堆栈的深度(SP- MCS51SpTop),并且保存到任务堆栈的栈顶;(3)把系统堆栈所有的内容保存到任务堆栈,这里既包括在(1)中入栈的13个寄存器也包括程序运行时需要保存的参数(斜线填充部分).应用任务出栈操作具体过程如下:(1),从任务堆栈的栈顶得到要进行出栈的深度;把任务堆栈所有内容恢复到系统堆栈;(2),把13个寄存器出栈(还剩下程序指针PC);(3),执行RETI命令,把系统堆栈中的地址恢复到程序指针PC.
    错误!链接无效. 图1任务堆栈和系统堆栈
    OSTaskStkInit()的函数原型为 OS_STK *OSTaskStkInit(void (*task)(void *pd),void *pdata, OS_STK *ptos, INT16U opt);其中task指向应用任务的起始地址,pdata是应用任务传递的参数指针,ptos是任务堆栈的栈顶指针,需要说明的是,MCS-51单片机的堆栈是递增的,所以这个指针应该指向任务堆栈的低地址,在OSTaskCreat()中调用这个函数时opt没有意义,将opt设置为0.OSTaskStkInit()中,主要保存新建任务栈的起始地址(2个字节),也就是在图1右半部分的虚线部分,由于任务还没有被调度,MCU的状态字并不具有实际意义.

    下一页

  • 下载地址 (推荐使用迅雷下载地址,速度快,支持断点续传)
  • 免费下载 DOC格式下载
  • 您可能感兴趣的
  • c8051f040定时器捕捉  c8051f020  c8051f020单片机  c8051f020应用笔记  c8051f020中文资料  c8051f020pdf  c8051f020引脚功能  c8051f020的外围电路  c8051f020电路原理