问题标签 [avr-gcc]

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.

0 投票
5 回答
1261 浏览

c - 为什么 avr-gcc 在调用 main() 时会费心保存寄存器状态?

avr-gcc 程序中的 main() 函数将寄存器状态保存在堆栈上,但是当运行时调用它时,我知道在微控制器上没有任何东西可以返回。这是浪费内存吗?如何防止这种状态保存?

0 投票
1 回答
713 浏览

timer - AVR 来自定时器中断的长时间运行代码

我有一些代码需要每 2 分钟运行一次,这看起来很简单。问题似乎是从计时器内触发长时间运行的进程会导致计时器摇摆不定?有什么建议么。

我的 C 知识不是那么好,所以请帮助我一些基本的想法。MCU 是 Atmel Mega128L

长时间运行的进程是通过 Telit GSM 设备(通过 UART1)的 http 调用,这本身就很好用,但需要在主循环之外运行,因为它需要监视其他进程。

0 投票
2 回答
1093 浏览

memory - 数组未跨越 256 字节边界

是否可以创建一个不跨越 256 字节边界的数组?也就是说,各个数组项的地址仅在低字节中有所不同。这比保持数组对齐到 256 字节的要求更弱。我能想到的唯一解决方案是与 对齐next_power_of_two(sizeof(array)),但我不确定以这种方式出现的差距。

它是用于 AVR 微控制器的库,这将在中断处理程序中为我节省一些宝贵的指令。在库使用的大约 80 个字节的总静态内存中,应该具有此属性的数组是 54 个字节长。我正在寻找一种不会增加内存需求的方法。

我正在使用 avr-as gnu 汇编器和 avr-ld 链接器。

示例:如果数组从地址 0x00f0 开始,则在遍历数组时,高位字将从 0x00 变为 0x01。

我真的不在乎它是从地址 0x0100 还是从 0x0101 开始,只要它不越界。

0 投票
1 回答
323 浏览

c - avr-gcc 3.4.0 和 avr-gcc 4.3.x 之间的二进制兼容性

我继承了一个链接到可能已经用 gcc3 构建的库的应用程序。或者也许使用 imagecraft 编译器。这些信息现在已经消失在天堂般的位域中,我只剩下一个 libXXX.a 库来链接我的应用程序。我无法重新编译 libXXX.a,因为它需要来自 imagecraft 和其他地方的某些未知头文件,这些头文件在某个时候可能在我的环境中无处不在,但现在无处可寻。

我的问题是,如果我使用 avr-gcc 版本 3.4.0 编译我的应用程序(并链接到那个“特殊”libXXX)会产生一个工作二进制映像,那么期望我可以编译所有其他部分是否合理?我的带有 avr-gcc 4 的应用程序(这个操作有一些非常好的和经过验证的好处),与 libXXX 链接并且仍然可以获得一个工作程序?

从本质上讲,这一切都归结为:avr-gcc 二进制文件是否与“可能是 avr-gcc 3.something 的神秘编译器 X”兼容?

老实说,我已经成功地用 avr-gcc4 编译了我的应用程序的其余部分并将其与库链接,并验证结果有效,但我应该注意什么样的副作用或怪癖?

0 投票
4 回答
3677 浏览

c - 使用 ATmega32 在 LCD 上显示阵列中的 ASCII 字符

我有一个 LCD,连接到 Atmega32,使用此功能处理单个字符:

我可以用一个字符作为参数来调用它:send_char('a');它有效。

然后我尝试在它周围包装一个 send_string 函数:

这只会在我的 LCD 上显示乱码,表明 ASCII 值已经很远了。当我尝试传递一个空字符串 ( send_string("")) 时,LCD 上至少会显示三个乱码。

0 投票
2 回答
2263 浏览

serial-port - Atxmega USART 流量控制

我在 Atxmega256 上的 USART 流控制方面遇到了一些问题。我正在与使用 RTS/CTS 进行流量控制的调制解调器通信。一旦调制解调器将 CTS 设置为低,我想停止发送数据,直到它再次变高。我目前正在使用中断驱动的 USART 例程,似乎找不到停止发送的好方法。如果我只是在 CTS 变低时停止发送,发送缓冲区中的所有数据仍将被发送并因此丢失。

我尝试了以下禁用/启用发送:

不幸的是,这似乎永久禁用了发送。有任何想法吗?

最好的问候弗雷德里克

0 投票
1 回答
665 浏览

c - 将字符存储在 EEPROM 中并回显

我正在尝试为 AVR STK600 板编写一个程序,在其中循环通过 LED。按下开关时,相应的 LED 会亮起(到目前为止,一切正常)。现在正在向电路板添加另一个功能,尝试使用 USART(RS232 串行通信)。

-当用户按下一个键时,它应该被回显(在超级终端上)。-当敲crtl-Z时,数据应该记录在EEPROM中(再次敲crtl-z应该停止记录)。-当按crtl-y时,应播放记录的数据。

这里遇到的问题是 USART(我确实检查了所有硬件设置,进行了环回测试......一切都运行良好)所以代码应该有一些问题。在该 EEPROM 之后,直到切换 LED 一切正常,USART 并不顺利。

这是我的代码,我正在使用 AVR-GCC。也没有使用“avrlib”,因为正在学习的课程不允许我们这样做:

这是header.h文件

如果有人可以帮助我解决这个难题,我将不胜感激。

提前致谢。

0 投票
2 回答
8631 浏览

c - AVR EEPROM 读写

我正在尝试从EEPROM(微控制器ATmega2560)写入和读取数据,这给了我错误的答案。当我调试它时,我看到只有最后一个字符被读取,尽管我看到数据被写入不同的地址。

在 uiAddress = 1 时,数据为A,在 uiAddress = 2 时,数据为B,uiAddress=3 data=67'C',依此类推。所以当你从 uiAddress = 0 读到最后一个地址时,你应该得到 ABCDE。我一次读一点,一个字符。

EESAVE 已启用。

为什么会这样?(我试图包含尽可能多的代码,原始文件太大。但这是相关领域)。

0 投票
1 回答
294 浏览

avr - 遇到“启动失败,因为找不到二进制文件”

在 AVR32 Studio (2.6) 中,我正在尝试调试 AVR 项目,但收到错误消息“启动失败,因为找不到二进制文件”。

我可以在控制台中看到构建完成(一个可执行的 .elf 文件在构建文件夹中)并且我已经清理了我的项目,创建了一个新的构建配置,但我似乎仍然无法启动(和/或对芯片进行编程) ) 调试器。

0 投票
2 回答
1230 浏览

avr - 如何更换 ATMEGA88 的引导加载程序

我有一块带有 ATMEGA88 芯片的电路板,它的引导加载程序位于地址 0x1800,固件位于地址 0x0000。两者都可以访问 USB。引导加载程序可以编写新固件,但现在我需要编写新的引导加载程序。

当然,这在使用 AVR 编程器时没有问题,但是否也可以通过 USB 执行此操作?我的想法是通过旧的引导加载程序刷新一个特殊的固件,然后可以编写一个新的引导加载程序。那可能吗?如果是,如何?

我目前的尝试没有成功。所有命令(boot_page_erase、boot_page_fill 和 boot_page_write)都以与引导加载程序相同的方式成功执行(唯一的区别是它从索引 0x1800 而不是 0x0000 开始写入)但是当我重新启动设备时,旧的引导加载程序仍然存在所以没有真正写入闪存。