bootloader平台上怎么使用中断?
我目前在ADS里写了段代码,里面用到了2410的IRQ外部中断10,编译后生成test.bin,当我使用DNW把它Transmit到RAM后,程序能够正常运行,能正常响应中断处理函数。
但是无论在vivi还是u-boot的平台上,固化test.bin后,程序都不能正常运行。
之前在vivi的平台上,有高手给出过如下建议:“如果需要中断,其实很简单,在某一RAM空间设置好中断向量然后将这一段空间映射到0地址就可以了。”但是我摸索了很久,也没弄懂到底该怎么做。
我的需求就是:使用ADS开发一些程序,其中肯定要用到中断,最后利用bootloader把编译好的程序烧写到板子上,但是我不跑操作系统。
目前在bootloader平台上使用中断碰到了很大的困难,大家能给些帮助吗?
多谢!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
要修改bootloader的代码,直接由bootloader下载向量表是由bootloader管理的。
你的代码所在位置根本不对~~
请教gaocheng:
为什么同样的一个bin文件,我使用DNW烧写时,就能正常响应中断,而在vivi或者u-boot下就不能正常响应中断?
目前中断相关的部分代码如下:
#define _ISR_STARTADDRESS 0x33ffff00
...
#define pISR_EINT8_23 (*(unsigned *)(_ISR_STARTADDRESS+0x34))
...
static void __irq EintHandler(void)
{
if (rINTPND==BIT_EINT8_23)
{
if(rEINTPEND&(1<<10)) //EINT8_23 判断子中断
{
Uart_Printf("Interrupt eint10 occur...\n");
rEINTPEND |= 1<< 10;
}
ClearPending(BIT_EINT8_23);
}
}
....
int main()
{
...
//initialize interrupt
rGPGCON = (rGPGCON & 0xFFFFFFCC) | 0x00000020;// GPG0 is input,GPG2 is EINT10
rGPGUP = (rGPGUP & 0xFFFA) | 0x0005; //禁止GPG2,GPG0上拉
rEXTINT1 &= ~(7<<8);
rEXTINT1 |= (2<<8);//set eint10 falling edge int
rEINTPEND |= (1<<10);//clear eint10
rEINTMASK &= ~(1<<10);//enable eint10
pISR_EINT8_23=(unsigned)EintHandler;
EnableIrq(BIT_EINT0|BIT_EINT2|BIT_EINT8_23);//开中断
while(1)
{
Uart_Printf("the main is running\n");
Delay(50);
}
}
bootloader代码应该怎么改呢?
[[i] 本帖最后由 mathieu 于 2007-10-9 10:39 编辑 [/i]]
建议你读一下U-boot代码,在u-boot下。中断由u-boot管理。不会访问你的中断处理函数
但是无论在vivi还是u-boot的平台上,固化test.bin后,程序都不能正常运行----固化程序后,程序就不存放在内存里面了,而是写在flash里面,flash的首地址是0x00000000,而内存的首地址则不是这个数。那你在程序里面进行跳转就会出问题吧,也许是因为这个。解决方法不详,但是没有操作系统的话,解决方法一定很多的。