发新帖我要提问
12
返回列表
打印
[AVR单片机]

各位大仙儿,暂停斗嘴,帮忙解决问题先

[复制链接]
楼主: 此心向学
手机看帖
扫描二维码
随时随地手机跟帖
21
AVR  Studio 设置


使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
此心向学 + 1
22
123jj| | 2010-8-13 14:35 | 只看该作者
反汇编结果

2.jpg (51.48 KB )

2.jpg

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
此心向学 + 1
23
123jj| | 2010-8-13 14:48 | 只看该作者
LZ
大仙儿没空,不知俺小三的回贴你是否满意

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
此心向学 + 1
24
此心向学|  楼主 | 2010-8-13 15:24 | 只看该作者
本帖最后由 此心向学 于 2010-8-13 15:26 编辑

很感谢大侠的耐心指导,俺实验了一下,大侠的方法可行。
请大侠再帮忙看看:我想在程序的未用地址,插入几条JMP  0x0000指令,实现程序跑飞了,运行到这条指令时能够软复位,下面的写法可以嘛(StartApp不用再main函数里写吧?).
另外:如要在0x0200,0x0300,……多个地址插入,是不是要写多个类似的StartApp()啊?刚才试了一下,把.mysection指定多个地址,不行。
#include <avr/io.h>
void StartApp(void) __attribute__ ((section (".mysection")));
void StartApp(void)
{
      asm("NOP");
      asm("JMP 0x0000");
}
int main(void)
{
  init();//初始化
  while(1)//主循环
  {
         //主体
  }
}


再请教一下,JMP  0x0000能否实现软复位,这样做AVR的各个寄存器的值能否和上电复位的值一样??

23# 123jj

使用特权

评论回复
25
123jj| | 2010-8-13 15:30 | 只看该作者
分别设为
void StartApp1(void) __attribute__ ((section (".mysection1")));
void StartApp1(void)
{       ......
}

void StartApp2(void) __attribute__ ((section (".mysection2")));
void StartApp2(void)
{       ......
}

void StartApp3(void) __attribute__ ((section (".mysection3")));
void StartApp3(void)
{       ......
}

然后依次重定义 .mysection1 为 0x0200,   .mysection2 为 0x0300,   .mysection3 为 0x0400 即可。

使用特权

评论回复
26
此心向学|  楼主 | 2010-8-13 15:33 | 只看该作者
谢谢谢 25# 123jj

使用特权

评论回复
27
123jj| | 2010-8-13 15:33 | 只看该作者
关于 JMP  0x0000能否实现软复位,这样做AVR的各个寄存器的值能否和上电复位的值一样??

玩玩可以,正式场合尽量不要用,否则容易产生模拟复位不到位,AVR的各个寄存器的值很难凑到和上电复位的值一致,正式场合如想复位,建议使用看门狗复位。

使用特权

评论回复
28
此心向学|  楼主 | 2010-8-13 15:52 | 只看该作者
大侠别嫌我笨,啰嗦啊
第一次做东东,不放心,我是用了自带的看门狗的,怕意外中断被关想再加一点防御措施

我在main函数开始的init()初始化函数里对要用到的寄存器初始化一下,这样,JMP  0x0000,以后再执行到mian是不是就可以了。

或者我这样改:把asm("JMP 0x0000")改成,
sei();
wdt_enable(WDTO_15MS);//启动看门狗
while(1);//
大侠觉得这样可行吗?
27# 123jj

使用特权

评论回复
29
xuyiyi| | 2010-8-13 16:02 | 只看该作者
我在main函数开始的init()初始化函数里对要用到的寄存器初始化一下,这样,JMP  0x0000,以后再执行到mian是不是就可以了。

------------------------------------------------------------------------------------------------------------------

理论上可以,实际上就怕经验不足,有所遗漏,如中断标志未清除干净,造成程序运行出错,因此,为求保险,尽量不要用。


你的 启动看门狗 之复位方法,是可行的,只是,为求保险可靠,尽量关闭中断!
即 sei();  改成   cli();

使用特权

评论回复
30
此心向学|  楼主 | 2010-8-14 11:57 | 只看该作者
谢谢耐心指导。学习了 29# xuyiyi

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则