问题标签 [avr]

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 回答
1236 浏览

c++ - 在 C++ 函数中传递原始数据类型的最佳实践

我正在为 avr 芯片编写一个函数,以将字节流反序列化为原始类型。我想以尽可能通用的方式进行操作,并且想知道确定要反序列化的类型的最佳实践是什么。到目前为止,我的想法包括:

选项A:

选项 B:

选项 C:

选项 D:

关于最好的方法的任何想法?也许我忽略了一个更简单的方法。

0 投票
4 回答
2791 浏览

c++ - 在没有双精度类型的 C 编译器上解析双精度 IEEE 浮点

我正在使用 8 位 AVR 芯片。64 位双精度没有数据类型(双精度只映射到 32 位浮点数)。但是,我将通过串行接收 64 位双精度,并且需要通过串行输出 64 位双精度。

如何在不强制转换的情况下将 64 位双精度转换为 32 位浮点并再次返回?32 位和 64 位的格式都将遵循 IEEE 754。当然,我假设在转换为 32 位浮点数时会损失精度。

为了从 64 位转换为 32 位浮点数,我正在尝试这个:

对于像 1.0 和 2.0 这样的数字,上述方法有效,但是当我测试将 1.1 作为 64 位双精度值传递时,输出稍微偏离了一点(从字面上看,不是双关语!),尽管这可能是一个问题我的测试。看:

0 投票
6 回答
4042 浏览

c - 优化此 C (AVR) 代码

我有一个中断处理程序,它运行得不够快,无法完成我想做的事情。基本上,我使用它通过将查找表中的值输出到 AVR 微控制器上的端口来生成正弦波,但不幸的是,这发生得不够快,无法获得我想要的波形频率。有人告诉我,我应该考虑在程序集中实现它,因为编译器生成的程序集可能效率低下并且可能能够进行优化,但是在查看了程序集代码之后,我真的看不出我可以做得更好。

这是C代码:

幅度和 numOfAmps 都被另一个运行比这个慢得多的中断例程改变(它基本上是为了改变正在播放的频率而运行的)。归根结底,我不会使用那些确切的数组,但它会是一个非常相似的设置。我很可能会有一个包含 60 个值的数组,而另一个只有 30 个值的数组。这是因为我正在构建一个频率扫描器,并且在较低频率下我可以提供更多样本,因为我有更多时钟周期可以玩,但是在更高的频率上,我的时间非常紧迫。

我确实意识到我可以让它以较低的采样率工作,但我不想每个周期低于 30 个样本。我不认为拥有指向数组的指针会使它变得更慢,因为从数组中获取值的程序集和从指向数组的指针中获取值的程序集似乎相同(这是有道理的)。

在我必须产生的最高频率下,我被告知我应该能够让它在每个正弦波周期处理大约 30 个样本。目前有 30 个样本,它运行的最快速度大约是所需最大频率的一半,我认为这意味着我的中断需要以两倍的速度运行。

因此,模拟时那里的代码需要 65 个周期才能完成。再一次,我被告知我最多应该能够将其降低到大约 30 个周期。

这是生成的 ASM 代码,我想到了它旁边的每一行的作用:

除了可能在中断中使用更少的寄存器以便我有更少的推送/弹出之外,我真的看不出这个汇编代码效率低下的地方。

我唯一的另一个想法是,如果我能弄清楚如何在 C 中获得一个位 int 数据类型,以便数字在到达末尾时会环绕,那么 if 语句可能会被删除?我的意思是我会有 2^n - 1 个样本,然后让amplitudePlace 变量继续计数,这样当它达到 2^n 时它会溢出并重置为零。

我确实尝试在没有 if 位的情况下完全模拟代码,虽然它确实提高了速度,但它只需要大约 10 个周期,因此一次执行大约需要 55 个周期,不幸的是仍然不够快,所以我确实需要进一步优化代码,如果没有它只有 2 行,这很难考虑!

我唯一真正的想法是看看我是否可以将静态查找表存储在需要更少时钟周期来访问的地方?它用来访问数组的 LDS 指令我认为都需要 2 个周期,所以我可能不会真正节省太多时间,但在这个阶段我愿意尝试任何事情。

我完全不知道从这里去哪里。我看不出如何让我的 C 代码更有效率,但我对这类事情还很陌生,所以我可能会遗漏一些东西。我很想得到任何帮助。我意识到这是一个非常特殊且涉及到的问题,通常我会尽量避免在这里问这些问题,但我已经为此工作了很长时间,而且完全不知所措,所以我真的会接受任何我能得到的帮助。

0 投票
1 回答
2384 浏览

c - 如何在 C 程序 (AVR) 中编写汇编 ISR?

继我的另一个问题之后,帮助优化此 C (AVR) 代码?:),我刚刚意识到我并不真正了解如何在我的 C 程序中在汇编中实现 ISR 的机制。我用谷歌搜索,但我没有发现任何有用的东西。

基本上我想在我的 C 项目中设置其他所有内容(包括触发中断的寄存器),但我希望中断执行我编写的一些汇编代码。

如果有帮助,我在 Windows 上使用 AVR studio 6。有人告诉我我需要使用.s文件,但除此之外我不确定该怎么做。基本结构就是下面这样吗?

如果我希望程序集在触发 TIMER1_COMPA_vect 中断时运行(这是 C 中 ISR 的名称)。还是我完全偏离了轨道?我需要做什么的基本模板是什么?或者,如果这是一个愚蠢的问题,是否有链接可以找到更多信息?

0 投票
1 回答
7736 浏览

timer - 我可以只在一个引脚上使用 Arduino 16 位 PWM 吗?

我有一个 Arduino Duemilanove,我想在其上使用内部 16 位定时器在引脚 9 而不是引脚 10 上执行 PWM(我的项目中有一个 Wifi 屏蔽,需要使用引脚 10)。

是否可以将定时器配置为在引脚 9 上发送信号但不触摸引脚 10?

0 投票
1 回答
3128 浏览

c - 通过指向avr程序集中数组的指针访问数组

我正在使用 C 和 ASM 混合编写 AVR 微控制器,但遇到了一些麻烦。

我的 C 代码中有以下代码:

(amplitudes32/64 基本上是查表)

有时我希望幅度等于幅度 32,有时希望它等于幅度 64。

我正在这样做

amplitudes = amplitudes32;在我的 c 代码中。

然后,在我的 ASM 中断例程中,我想像这样读取数组的地址:

然后我做一些更多的指令来将某个索引处的数组值传到一个特定的端口。但是,当我检查输出时,它不能正常工作并且我得到了一些我没想到的东西。无论数组由什么组成,我都会得到相同的结果。即使amplitudes指向全零数组也是一样的。

如果我将汇编代码更改为

然后它按预期工作。但是就像我说的那样,我需要在不同的时间有一个不同的查找表,并且由于速度问题,我无法在中断例程中做出这个决定,所以如果我能有一个数组“变量”就好了可以在我的 C 代码中更改,然后中断使用。

我究竟做错了什么?

0 投票
1 回答
240 浏览

c - 解释这段代码

谁能解释一下这段代码?

0 投票
2 回答
5630 浏览

avr - 在 FreeRTOS 中为 USART 接收创建新任务

我正在使用带有 AVR Studio 5 的 EVK1105 开发板作为我的 AVR 项目的开发 IDE。我在其中使用 FreeRTOS。我在这块板上有 3 个 USART 端口。一个外部模块通过 USART-RS232 模式连接到我的 AVR32 板。它以 19230 波特率、7 数据位、奇校验、停止位 1 和正常通道模式将连续串行数据发送到我的 USART0 板上。为此,我创建了一个新任务。在每 9 个数据字节之后,它发送 '\n' 和 '\r'。所以在我的任务中,我继续在字符串缓冲区中收集 9 个数据字节,然后在 USART1 上传输它。我正在使用轮询方法从正在接收端口的 USAR0 收集数据。但是我在接收数据时遇到了问题。我不知道是时间问题还是调度程序在收集数据时切换了任务。但我没有得到所需的数据。

以下是我已经检查过的故障排除 1. 将我的外部模块连接到我的 PC 超级终端,这给了我完美的结果。2. 实现了使用从 USART0 接收的相同操作,并且无论接收到什么都将传输到 USART1,就像没有 FreeRTOS 一样。它工作正常。

请提出一些想法可能出了什么问题。我正在使用队列在 Tx 和 Rx 任务之间进行通信,以将字符串缓冲区从 USART0 传递到 USART1。处理队列有问题吗?如何解决队列问题?

我在 Rx Task 的无限任务循环中使用了 50 毫秒的延迟。它会产生问题吗?如果我不使用任何延迟,操作系统就会崩溃。请提出一些好的做法来在 FreeRTOS 中创建新任务,这样我就不会遇到任何时间问题。

0 投票
3 回答
5961 浏览

c++ - AVR - 中断向量和全局变量

我正在使用 ATmega32 每 32 毫秒中断一次以做一些任意的事情,这目前并不重要。
我正在使用 timer0 的定时器溢出来中断,它的工作原理是可预测的和完美的。

我的问题是我有一个全局变量:

volatile int isSampling;

那没有被写入中断向量中。我读到整数需要volatile消除编译器优化的可能性,但我将其声明为volatile它仍然无法正常工作。

好的,我找到了导致问题的有问题的代码,但我不确定它为什么会导致它。当我loadValue(studentID[i])从主 while 循环中删除时,代码按预期工作。但是当我把它放回去时,它又坏了。

0 投票
2 回答
2031 浏览

arm - Atmega 和 ARM UART 连接。奇怪的行为

所以,这是一个复杂的问题,与 AVR 无关,但我认为问题在于 Atmega。

  • 我有基于 ARM NUC745 的 FOSCAM WI-FI 相机,它在 uClinux 下运行。那台相机上有一个 UART 端口,它与我的 Atmega 板相连。同时ARM板上的UART用于控制台输出和输入。

  • 我可以通过相机提供的网络界面发送命令,这些命令通过 ARM 板通过 UART 发送到 Atmega 板。

  • 我为 Atmega 编写了一个程序来读取来自 ARM 的 UART 数据。所有数据似乎都被 Atmega 接收了。关于接收到的数据,Atmega 通过 UART 将数据从 Atmega 发送到 ARM 板。在 VMLAB 中,我可以看到数据正在示波器中输出。但 ARM 板不接收该数据。当我将 Atmega 板与 ARM 板断开连接并将 ARM 板连接到 iMac 上的终端时,Atmega 发送的所有数据迅速出现在终端中,我为 ARM 板编写的程序接收到所有数据。

这是很奇怪的行为。似乎终端连接和 Atmega 串行连接不同,我不明白为什么:(((

抱歉,我无法正确格式化代码

这是Atmega的代码

和 ARM linux 的代码

有人可以帮我解决这个问题吗