问题标签 [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.
c - 8位枚举,C语言
我必须存储指令,我将通过串行接收的命令。命令的长度为 8 位。
我需要保持命令名称及其值之间的透明度。以避免必须将串行接收的 8 位数字转换为任何类型。
我想在我的代码中使用枚举来处理它们。在这个平台上,只有一个枚举对应一个 16 位整数。
该平台是 AVR ATmega169V 微控制器,在Butterfly 演示板上。它是一个 8 位系统,对 16 位操作的支持有限。它不是一个快速的系统,并且有大约 1KB 的 RAM。它没有文件 I/O 或操作系统之类的奢侈品。
那么关于我应该使用什么类型来存储 8 位命令有什么建议吗?
必须有比#defines 的大量标题更好的东西。
c - 函数指针位置未通过
我有一些针对 AVR 的 C 代码。代码是用 avr-gcc 编译的,基本上是带有正确后端的 gnu 编译器。
我想要做的是在我的一个事件/中断驱动库中创建一个回调机制,但我似乎在保持函数指针的值时遇到了一些麻烦。
首先,我有一个静态库。它有一个头文件 ( twi_master_driver.h
),如下所示:
现在是 C 文件 ( twi_driver.c
):
然后我将这两个文件构建到一个静态库 (.a) 中并构建我的主程序 ( main.c
) #include #include #include #include #include "twi_master_driver.h"
我小心地触发导致中断触发的事件并调用适当的处理程序。使用一些 fprintfs,我可以看出函数中分配的位置twi->slave.slave_callback
与twi_init
函数中的位置不同twi_slave_interrupt_handler
。
虽然数字没有意义,twi_init
但值是 0x13b,twi_slave_interrupt_handler
打印时值是 0x100。
通过在中添加注释的解决方法行twi_driver.c
:
问题消失了,但这显然是一个神奇且不受欢迎的解决方案。我究竟做错了什么?
据我所知,我已经标记了适当的 variables volatile
,并且我尝试将其他部分标记为 volatile 并删除 volatile 标记。fprintf
当我注意到在赋值后删除语句twi_init
导致稍后以不同方式读取值时,我想出了解决方法。
问题似乎在于我如何传递函数指针——尤其是访问指针值的程序部分(函数本身?)在技术上位于不同的线程中。
有任何想法吗?
编辑:
解决了代码中的拼写错误。
链接到实际文件:http : //straymark.com/code/ [test.c|twi_driver.c|twi_driver.h]
fwiw:编译器选项:
-Wall -Os -fpack-struct -fshort-enums -funsigned-char -funsigned-bitfields -mmcu=atxmega128a1 -DF_CPU=2000000UL
我已经尝试过直接包含的相同代码(而不是通过库),但我遇到了同样的问题。
编辑(第 2 轮):
- 我删除了所有优化,没有我的“解决方法”,代码按预期工作。添加回 -Os 会导致错误。为什么 -Os 会破坏我的代码?
c - 使用字符数组作为长整数数组
在我的 AVR 上,我有一个字符数组,它们以 {R,G,B,x,R,G,B,x,...} 的形式保存颜色强度信息(x 是未使用的字节)。有什么简单的方法可以写一个 long int(32 位),char myArray[4*LIGHTS]
这样我就可以轻松地写一个 0x00BBGGRR 数字?
我的类型转换很粗糙,我不知道该怎么写。我猜只是创建一个指向 long int 类型的指针并将其设置为等于 myArray,但是我不知道如何任意告诉它将组 x 设置为 myColor。
编辑:我不确定类型转换是否是正确的术语,因为我认为如果它只是将 32 位数字截断为 8 位?
parsing - 编写可在 8 位嵌入式系统上使用的解析器,如 Flex/Bison
我正在使用 avr-gcc 工具链为类似 BASIC 的简单语言编写一个小型解释器,作为 C 语言 AVR 微控制器上的练习。
如果我写这个是为了在我的 Linux 机器上运行,我可以使用 flex/bison。既然我将自己限制在 8 位平台,我将如何编写解析器?
c - 嵌入式系统上的中断繁重代码的单元测试
我正在为AVR芯片编写 C 代码。该代码在串行端口、ADC和定时器上等待的中断服务例程(ISR) 上很繁重。ISR 写入缓冲区,当主循环到达缓冲区时会对其进行检查。
我设计了缓冲区,以便 ISR 可以在主循环读取它们时更新它们。我想验证这是否有效。我有单元测试来验证基本操作,但我不清楚如何测试如果在主循环读取缓冲区时触发中断会发生什么。
我的单元测试非常基础——main()
函数中的一些代码。我在我的 Linux 机器上运行测试。
osx-snow-leopard - 未找到符号 - Snow Leopard 上的 CUnit
我刚刚使用 MacPorts/DarwinPorts 在 Snow Leopard 上安装了 CUnit。安装很顺利,但是在尝试运行单元测试时出现错误:
有没有人遇到过这个问题,或者有没有人成功地让 CUnit 以其他方式在 Snow Leopard 上工作?
embedded - AVR 模拟比较器 + 内部上拉?
我希望这是一个与 Atmel AVR 微控制器有关的简单问题。所以我想使用 ATtiny85 的模拟比较器来确定信号是高于还是低于阈值。该信号通常是“浮动的”,并在“活动”时拉向地线(即它是一个活动的低电平 - 集电极开路信号)。如果我通过执行以下操作启用输入引脚(也是比较器输入)上的上拉:
如果我使用模拟比较器并选择 PORTB.1 作为 AIN1,内部上拉电阻会应用于我的输入信号吗?我希望有人有个人经验来验证这种行为。希望这个问题对于堆栈溢出来说不是太“面向硬件”。谢谢!
编辑 针对以下关于“为什么不对其进行数字处理”的一些评论,这是因为我的“信号”是由传感器(即光学红外传感器)生成的。我不能保证它会拉低“足够硬”以在数字上被解释为零,所以我将使用内部 2.56V 参考作为我的开关阈值。我只是想了解“IR 事件”,所以这对我来说似乎是最简单的方法。
此外,通过使用模拟比较器,我可以使用 ISR“异步”检测事件。授予某些引脚可以在数字边缘调用中断,但不想依赖响应降至 V_IL 以下。
assembly - AVR sbi 命令 - 错误:数字必须为正且小于 32
我花了很长时间使用完整的 GCC 工具链设置我的 AVR 开发系统(一切都是最新的当前稳定版本),并且我已经解决了大多数问题,但只有一个。
下面的代码给了我一个我没有得到的错误。AVR 汇编手册指出 sbi 指令可以接受 0-7 作为常量表达式,但我仍然出错。任何人都可以解释一下为什么会这样吗?
有问题的行是 sbi PORTB, 0。
编译/组装:
avr-gcc ledon.S -mmcu=atmega168
c - crt0.o 和 crt1.o -- 有什么区别?
最近我一直在尝试调试一些低级工作,但我找不到crt0.S
编译器(avr-gcc),但我确实找到了一个crt1.S
(与相应的.o
文件相同)。
这两个文件有什么区别?是crt1
完全不同还是什么?它们似乎都与“引导”(设置stack frame
等)有关,但为什么要区分呢?
compilation - AVR_GCC 编译错误 delay.h
blinky.zip、gcc 部分、Teensy++ v.2 中的说明。Makefile 和 blinky.c 在 zip 中。我在开始时通过定义 F_CPU 修改了 blinky.c,因为没有使用 Makefile,请参见下文。那么为什么会出现错误以及如何为 at90usb1286 芯片编译 C 文件?