本帖最后由 Alex_lyf 于 2010-4-1 14:55 编辑
ARM Subsystem.pdf
(1.05 MB)
出于兴趣,我正尝试着把uc/os-II移植到tms320dm6446平台,我想将自己在移植过程中遇到的问题向大家请教。问题如下:
TI的Davinci tms320dm6446集成了ARM(ARM926EJ)与DSP核,我的目的是让uc/os-II能运行在DM6446的ARM端。我的开发环境是CCS3.3,到目前为止我已经做了大部分工作,能实现任务切换。但如何实现Timer0中断让我很困惑,希望能得到您的帮助。
DM6446 ARM端中断控制器:
- 支持64个中断源
- 每个中断源可分别使能
- 每个中断源可通过设置优先级成为两种中断类型(FIQ与IRQ)之一
- 中断优先级可由用户自定义。中断优先级共有8级,若中断优先级为(0x2-0x7),则ARM核将进入IRQ模式, 若中断优先级为(0x0-0x1)则ARM核将进入FIQ模式。
我将Timer0中断优先级设为0x2,因此其中断类型为IRQ,然后使能Timer0中断,屏蔽其他所用中断。当Timer0中断产后,ARM核将接收到来自Timer0的IRQ中断请求,与此同时,Timer0中断的用户中断服务子程序的入口地址将自动产生,并保存在ENTRY寄存器(可见技术手册ARM Subsystem.pdf),接着IRQ中断服务程序将从ENTRY寄存器中读取用户中断
子程序的地址并直接跳转到该地址执行用户中断服务子程序。上述过程都是硬件自动完成的,用户需要干涉的仅限于:
1、中断使能
2、中断优先级设置
3、产生用户中断服务子程序的入口地址的基地址
在我的程序中,我可以确定Timer0中断已经产生,并且自动生成了用户中断服务子程序的入口地址:0x80000420。为了最终能让我的Timer0中断服务程序TimerOneTick()能运行起来,我在CCS下修改了.cmd并编写了一段汇编程序如下:我的目的是想在0x80000420地址处放一条跳转指令,好让我的程序TimerOneTick()能运行起来。cmd文件:
-lrts32earm9.lib
-stack 0x00000800 /* Stack Size */
-heap 0x00000800 /* Heap Size */
MEMORY
{
IRAM: o = 0x00000000 , l = 0x00004000
DRAM: o = 0x00008000 , l = 0x00004000
AEMIF: o = 0x02000000 , l = 0x02000000 /*32M*/
VECT: o = 0x80000420 , l = 0x00003000
DDR2: o = 0x80004000 , l = 0x0FFFC000 /*256M*/
}
SECTIONS
{
.vector > VECT
.bss > DDR2
.cinit > DDR2
.cio > DDR2
.const > DDR2
.stack > DDR2
.sysmem > DDR2
.text > DDR2
.ddr2 > DDR2
}
汇编程序:
.ref _TimerOneTick
.sect ".vector"
b _TimerOneTick
.end
但事与愿违,我的TimerOneTick()程序始终都没有运行起来,不知道这中间的问题何在?请赐教。(感谢你读完了这篇描述,我深表感激) |