我的ucos在用IAP下载到mega32后为什么不工作了?
我的ucos在用IAP下载到mega32后为什么不工作了?我在bootload程序中用到了定时器0,ucos负责任务切换的是定时器2。哪位高手分析一下会是什么问题。谢谢!! 直接烧录时UCOS行不行?
可以读出FLASH里面的内容对比看看IAP是否正确。 直接烧录ucos工作正常 读出的IAP没有变化,而且开机可以提示下载,也能下载 是对比编译UCOS生成的BIN文件,不是HEX文件。
读出FLASH里面的内容和BIN文件对比,看看数据是否匹配。 好,我试试 谢谢! HJJourAVR您好!我将读出的文件存为bin格式,然后与烧录的bin文件对比,并没有变化。是不是我的程序本身有问题,是否与堆栈设置有关? 确认IAP的最后动作是 JMP 0x0000H 而且 中断向量位于应用程序库区 ? 我的quit程序如下:
void quit(void)
{
uart_putchar('O');
uart_putchar('K');
uart_putchar(0x0d);
uart_putchar(0x0a);
while(!(UCSRA & 0x20)); //等待结束提示信息回送完成
MCUCR = 0x01;
MCUCR = 0x00; //将中断向量表迁移到应用程序区头部
// RAMPZ = 0x00; //RAMPZ清零初始化
asm("jmp 0x0000
"); //跳转到Flash的0x0000处,执行用户的应用程序
} 下载后能显示任务1的初始画面,但是不能任务切换 HJJourAVR 您好!我测试了几次发现当我配置BOOTRST=1时,即复位从程序区运行,ucos工作是正常的,当我配置BOOTRST=0时ucos就不切换了。ucos是用IAP下载的.想请教HJJourAVR这会是什么造成的。谢谢! 应用程序(ucos)需要把所有外设的功能寄存器重新赋初值。
你的UCOS没有考虑所有外设的[上电初始化值]已经可能被IAP所更改。 终于调出来了!!
我在主程序开头加入了如下代码
main ()
{
///-------------------------
PORTA=0;
DDRA =0;
PORTB=0;
DDRB =0;
PORTC=0;
DDRC =0;
PORTD=0;
DDRD =0;
UDR=0;
UCSRA=0x20;
UCSRB=0;
UCSRC=0x86;
UBRRH=0;
UBRRL=0;
SFIOR=0;
TIMSK=0;
TCNT2=0;
TCCR2=0;
///-------------------------
OSInit(); // OS init
......
}
即将端口寄存器和串口和管任务切换定时器2的寄存器都作了初始化,问题解决。谢谢HJJourAVR 的指点!
页:
[1]