加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ARM处理器最干净的重置

发布时间:2020-12-16 10:27:32 所属栏目:百科 来源:网络整理
导读:最近,我一直在清理一些在ARM7控制器上运行的C代码.在某些情况下(升级,致命错误等),程序将执行重置.目前它只是跳到0并假设启动代码将正确地重新初始化所有内容.这让我想到了ARM复位的“保留无迹线”的最佳程序.这是我的第一次破解: void Reset(void){ /* Dis
最近,我一直在清理一些在ARM7控制器上运行的C代码.在某些情况下(升级,致命错误等),程序将执行重置.目前它只是跳到0并假设启动代码将正确地重新初始化所有内容.这让我想到了ARM复位的“保留无迹线”的最佳程序.这是我的第一次破解:

void Reset(void)
{
   /* Disable interrupts */
   __disable_interrupts();

/* Reset peripherals,externals and processor */
AT91C_BASE_RSTC->RSTC_RCR = AT91C_RSTC_KEY | AT91C_RSTC_PERRST | AT91C_RSTC_EXTRST| AT91C_RSTC_PROCRST;

while(AT91C_BASE_RSTC->RSTC_RSR & AT91C_RSTC_SRCMP);

/* Jump to the reset vector */
(*(void(*)())0)();
}

此代码假定IAR ARM编译器和At91Lib.还有什么我没想过的?

解决方法

这应该够了吧.我使用与Atmel SAM3U类似的功能.我从不打扰轮询状态寄存器,但这是一个好主意,我现在就去添加它!

但是,由于处理器已经重置,因此您永远不应该进入复位向量线. IAR具有__noreturn属性,可用于这些情况以进一步优化编译器.我还将我的重置功能加载到ram中(参见__ramfunc),因为我在固件更新结束时使用,其中微控制器无法从闪存运行.

此外,除非您使用该线路控制外部设备的复位,否则不应使用AT91C_RSTC_EXTRST标志.

__noreturn void Reset(void)
{
    __disable_interrupts();

    AT91C_BASE_RSTC->RSTC_RCR = AT91C_RSTC_KEY |
                                AT91C_RSTC_PERRST |
                                AT91C_RSTC_EXTRST |
                                AT91C_RSTC_PROCRST;

    while (AT91C_BASE_RSTC->RSTC_RSR & AT91C_RSTC_SRCMP);
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读