问题标签 [avr32]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 跳出内联汇编到 AVR32 上的错误目标
我们正在使用 AtmelStudio 7.0.1645 为 Atmel AVR32 / UC3C0512C 开发应用程序。在进行一些基本测试时,我注意到一些非常奇怪的事情。
请考虑以下代码(我知道它的风格不好且不常见,但这不是重点):
在查看该代码的反汇编时(在编译/链接之后),我发现以下内容:
我们注意到这rjmp
已经成为bral
- 完全可以接受的,只是同一件事的另一个助记符。
但是当查看该行中的分支目标时,我们还注意到这将产生一个无限循环,它显然不应该这样做。它应该分支到786aa
(这是函数返回的开始)而不是786a6
.
如果我更改代码使其显示为
它按预期工作,即反汇编现在读取
我们注意到现在的分支目标是正确的。
所以内联汇编器显然不知道 C 标签(即不在内联汇编中的标签),这本身就可以 - 经验教训。
但此外,它在遇到未知(未定义)标签时不会发出警告或抛出错误,而是在分支/跳转到此类标签时仅使用偏移量 0 来产生无限循环。
我认为后者是一个灾难性的错误。这可能意味着(没有任何警告)每当我在内联汇编代码中使用未定义的标签时(例如因为拼写错误),我的软件中都会出现无限循环。
我能做些什么吗?
c - freeRTOS 是否支持 Atmel AT32UC 3C?
我有一个我想使用的 Atmel AT32UC 3C。我刚刚开始使用 freeRTOS。我正在使用 Eclipse IDE 和 MingW gcc 编译器,我下载了 FreeRTOS v8.2.3、v9.0.0 和 v10.2.1。问题是我找不到 AT32UC 3C 的演示示例;仅 AT 32UC 3A 和 3B 可用。我错过了什么吗??
c++ - 用户页面 NVRAM 使用后奇怪的 UC3 重置行为
我最近需要在AT32UC3L0256的 build NVRAM/EEPROM 中使用来存储一些配置数据。我终于设法使用 MCU 的用户页面 NVRAM(经过几天的反复试验和诅咒 GCC 忽略noinit
指令以及像往常一样修复和解决 ASF 中的错误)到这样的东西:
为了能够写入完整的 512 字节,我必须进行更新flashcdw.c,flashcdw.h
,因为旧 ASF 确实编程了最多 256 字节,但擦除了整个页面,弄得一团糟。ASF 3.48.0.98
我还必须存储整个页面(而不是因为擦除而只存储 8 个字节),并且像往常一样由于 ASF 错误,我需要按原样进行操作,而不是只调用flashcdw_memcpy
一次...
它现在可以工作,但我发现某些地址会导致奇怪的行为。当0xFF
不在某个地址上时,设备将不再正常复位(但在复位运行正常之前仍然如此)。在非引导加载程序重置时,它会启动固件代码,但在几次之后[ms]
它会再次重置,这会永远持续下去。要清楚 RESET 发生在这部分代码中(在我的情况下):
配置系统后 LED 会简单闪烁(PLL CPU 时钟、配置的定时器和 ISR,但仍禁用中断)。LED 应闪烁几次(PLL 以正确的速度工作)但在循环完成之前发生复位。等待很简单:
更奇怪的是,如果我启动引导加载程序然后再次正常重置,设备正在正确重置并且固件再次工作(没有任何擦除/编程)但是如果我再次正常重置,重置循环再次发生......
如果我.userpage
使用 BatchISP(翻转)将 NVRAM 重新编程回原始状态,则芯片会再次正常工作。
所以最后的问题:
NVRAM 的用户页中的哪些地址会导致此问题或应保留/避免更改?
我知道最后 8 个字节是引导加载程序配置。我怀疑有问题的地址是前 16 个字节。应该用于用户数据并且
.userpage
不包含保险丝。怎么了?
它是某种看门狗还是什么?我以为那些是存放在其他地方的保险丝。我在数据表中看不到任何内容。
这里是原始的十六进制.userpage
:
我使用这些(翻转命令)来获取和恢复它:
有问题的引导加载程序是 USART 版本:1.0.2 并且具有此行为的固件使用PLL、TC、GPIO、PWMA、ADC模块,但是在任何 ISR 和/或 ADC、PWMA、TC 使用之前发生复位。
[Edit1] 看门狗
据此,NVRAM 中的第一个字.userpage
是看门狗的保险丝,它解释了在ms
将数据修复为原始值并禁用 复位WDT
停止后几次复位。然而,现在不是启动程序而是启动了引导加载程序,所以仍然有一些可疑的东西。Bootloader 管脚选择在最后 8 字节
我还查看了 USART Bootloader ver: 1.0.2 源代码,发现它们正在使用FLASHC
而不是FLASHCDW
强制启动看门狗(这可能会重置其状态并使我的程序以某种方式再次运行)。
[Edit2] 错误隔离
我终于发现问题是由写入 512 字节的最后一个 32 位字引起的.userpage
:
这是一个巨大的问题,因为为了正确存储数据,我必须使用擦除来擦除整个页面,无论如何,为了仍然能够正确引导到引导加载程序或我的固件,我必须恢复引导加载程序配置数据:
我需要找到一种解决方法,如何将芯片恢复到功能状态。也许从引导加载程序复制看门狗重置(但这在我的应用程序中会非常有问题,甚至有风险),因为即使没有任何闪烁,它也会恢复芯片......
所以现在映射:
[Edit3] 解决方法
我设法成功地写入/读取程序存储器闪存(用 BatchISP 和 MCU 本身检查)它也可以正常启动。
这里的代码我用以下代码进行测试:
flash_adr
找到的地址与签名匹配的地址在哪里buf[]
......(我在 LCD 上打印它,所以我看看它是否符合我的预期),它终于做到了:)。所以我将使用它而不是.userpage
.
然而,.userpage
引导问题修复仍然是悬而未决的问题