微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > μCOS-II在ATmega128单片机上的移植与开发

μCOS-II在ATmega128单片机上的移植与开发

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

ATmega128有34个不同的中断源,每个中断源和系统复位在程序存储空间都有一个独立的中断向量(中断入口地址) 。每个中断源都有各自独立的中断允许控制位,当某个中断源的中断允许控制位为“1”且全局中断允许位I也为“1”时,系统才响应该中断。当系统响应一个中断请求后,会自动将全局中断允许位I清零,此时,后续中断响应被屏蔽。当系统执行中断返回指令RETI时,会将全局中断允许位I置“1”,以允许响应下一个中断。若用户想实现中断嵌套,必须在中断服务子程序中将全局中断允许位I置“1”。在中断向量表中,处于低地址的中断具有高的优先级。优先级高只是表明在多个中断同时发生的时候,系统先响应优先级高的中断,并不含有高优先级的中断能打断低优先级的中断处理工作的意思。由于μC/OS-Ⅱ的任务切换实际上是模拟一次中断,因此需要知道CPU的中断响应机制。中断发生时,ATmega128按以下步骤顺序执行:

 (1) 全局中断允许位I清零。

  (2) 将指向下一条指令的PC值压入堆栈,同时堆栈指针SP减2。

  (3) 选择最高优先级的中断向量装入PC,程序从此地址继续执行中断处理。

  (4) 当执行中断处理时,中断源的中断允许控制位清零。中断结束后,执行RETI指令,此时:

  ①全局中断允许位I置“1”。

  ② PC从堆栈推出,程序从被中断的地方继续执行。特别要注意的是:ATmega128A单片机在响应中断及从中断返回时,并不会对状态寄存器SREG 和通用寄存器自动进行保存和恢复操作,因此,对状态寄存器SREG 和通用寄存器的中断保护工作必须由用户来完成。

  ATmega128的定时器中断

  

ATmega128有三个定时器:T0,T1,T2,可以为μCOS-II提供精确的时钟源。ATmega128的三个定时器都有计数溢出中断功能,而且T1和T2还有匹配比较中断,即定时器计数到设定的值时,产生中断并自动清零。若系统采用这种中断方式,其好处是在中断服务程序ISR中不需要重新装载定时器的值。

  将μCOS-II移植到ATmega128单片机上

  移植就是使一个实时内核能在ATmega128上运行。μCOS-II大部分的代码是用ANSIC编写的,因此移植性很好。但是对不同的微处理器,仍然需要使用C和汇编语言来编写其中与处理器相关的代码,寄存器的读、写只能通过汇编语言的存储和加载指令来实现。要使μCOS-II能够正常工作,处理器必须满足以下要求:

  ①处理器的C编译器能产生可重入代码;可重入代码是指可以被一个以上的任务调用,而不必担心其数据会被破坏的代码。可重入代码任何时候都可以被中断,一段时间以后又可以重新运行,而相应的数据不会丢失,不可重入代码则不行。本文所使用ImageCrafT公司的ICCAVRV6. 30编译器能产生可重入代码;

  ②用C语言可以打开和关闭中断,本文所使用的ICCAVRV6. 30编译器支持在C语言中内嵌汇编语句且提供专门开关中断的宏:CLI() 和SEI() 。这样,使得在C语言中开关中断非常方便;

  ③处理器支持中断,并且能够产生定时中断(通常在10-100Hz 之间) ,ATmega128,有3 个定时器,能产生μC/OS-Ⅱ所需的定时中断;

  ④ 处理器能够支持容纳一定数量的硬件堆栈,ATmega128有4KRAM,硬件堆栈可以开辟在这4KRAM中;

  ⑤处理器有将堆栈指针和其他寄存器读取和存储到堆栈或内存的指令,一般的单片机都满足这个要求(如PUSH、POP指令) ,且ATmega128还具有直接访问I/O寄存器的指令( IN、OUT等) 。

  移植的实现μC/OS-Ⅱ的移植工作包括以下几个内容:

  (1) 用Typedef声明与编译器相关的数据类型(在OS-CPU. H文件中) ,由于不同的微处理器有不同的字长,在μC/OS-Ⅱ代码中不能使用C语言的shORT、inT、lOng 等数据类型,而采用INT8U、INT16U、INT32U等直观又可移植的数据类型来代换相应数据类型。

  (2) 用# definE设置一个常量OS-STK-GROWTH的值(OS-CPU. H) ,决定堆栈的生长方向,置0表示堆栈从下往上生长,置1表示堆栈从上往下生长。

  (3) # definE声明三个宏(OS-CPU. H) 。即进入临界代码段(criTicaLcOdEsecTiOn) 的方法OS-CRITICAL-METHOD定义为3 ,在宏OS-ENTER-CRITICAL() 中得到当前处理器状态字的值,并将其保存在C函数的局部变量中,这个变量在宏OS-EXIT-CRITICAL( ) 中用于恢复PSW。宏OS-TASK-SW() 是在内核从低优先级任务切换到高优先级任务时用到的,它总是在任务级代码中被调用。在ATMEGA128上移植,直接调用OSCTxSw () 任务切换函数就可以了。

(4) 用C语言编写十个简单的函数(OS-CPU-C. C) ,OS2TAskSTKIniT() ;OSIniTHoOkBegiN() ;OSIniTHoOKEnd () ; OSTAskCreaTeHoOK( ) ;OSTAskDelHoOK( ) ;OSTAskSw HoOK();

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

网站地图

Top