标签: avr

关于新AVR指令LAC,LAS,LAT和XCH的更多细节

查看AVR指令集,2010年增加了四条指令

LAC load and clear
LAS load and set
LAT load and toggle
XCH load and exchange
Run Code Online (Sandbox Code Playgroud)
  1. 有谁知道芯片有这些说明

  2. 哪些工具支持这些说明

  3. 有关他们所做工作的更多信息

    (Z)< - Rd v(Z),Rd < - (Z)

这是否意味着Rd和(Z)获得相同的值或者Rd获得Z指向的预修改值?

assembly avr arduino atmel

11
推荐指数
1
解决办法
2312
查看次数

速度比较eeprom-flash-sram

目前编码atmel tiny45微控制器,我使用了几个查找表.存放它们的最佳位置在哪里?你能给我一个关于sram-flash-eeprom之间内存速度差异的一般概念吗?

memory avr

11
推荐指数
1
解决办法
6300
查看次数

用USB设备打开电脑

我希望能够使用通过USB连接到PC的红外遥控传感器来打开和关闭电脑.该传感器是一个定制PCB,采用AVR微处理器和V-USB软件USB实现.

现在,关闭电脑对软件没问题,但有没有办法用USB打开电脑?

(请注意,我不是在谈论从USB记忆棒或USB电源启动......)

usb avr htpc

10
推荐指数
2
解决办法
3万
查看次数

优化此C(AVR)代码

我有一个中断处理程序,运行速度不够快,我想做的事情.基本上我用它来生成正弦波,通过从AVR微控制器上的查找表输出值到PORT,但不幸的是,这种情况发生的速度不足以让我获得我想要的波的频率.有人告诉我,我应该考虑在汇编中实现它,因为编译器生成的汇编可能效率稍低,并且可以进行优化,但在查看汇编代码后,我真的看不到我能做什么更好.

这是C代码:

const uint8_t amplitudes60[60] = {127, 140, 153, 166, 176, 191, 202, 212, 221, 230, 237, 243, 248, 251, 253, 254, 253, 251, 248, 243, 237, 230, 221, 212, 202, 191, 179, 166, 153, 140, 127, 114, 101, 88, 75, 63, 52, 42, 33, 24, 17, 11, 6, 3, 1, 0, 1, 3, 6, 11, 17, 24, 33, 42, 52, 63, 75, 88, 101, 114};
const uint8_t amplitudes13[13] = {127, 176,  221, 248,  202, 153, 101, 52, 17,  1, …
Run Code Online (Sandbox Code Playgroud)

c optimization assembly avr

10
推荐指数
1
解决办法
3614
查看次数

微控制器EEPROM耗损均衡是否有通用算法?

我正在开发一个Arduino库,它可以最大限度地延长AVR EEPROM的使用寿命.它需要您想要存储的变量数量,其余部分.这是我的尝试,在所有情况下都不起作用.

背景资料

Atmel表示,每个存储器单元的额定写入/擦除周期为100,000次.他们还提供了一份应用说明,介绍了如何进行磨损均衡.以下是应用笔记的摘要.

通过在两个存储器地址之间交替写入,我们可以将擦除/写入增加到200,000个周期.三个存储器地址为您提供300,000个擦除/写入周期,依此类推.要自动执行此过程,将使用状态缓冲区来跟踪下一次写入的位置.状态缓冲区的长度也必须与参数缓冲区的长度相同,因为也必须对其进行磨损均衡.由于我们无法存储下一个写入的索引,因此我们在状态缓冲区中增加相应的索引.

这是一个例子.

   <------------------- EEPROM -------------------->  
   0                                               N
   -------------------------------------------------
       Parameter Buffer    |     Status Buffer     |
   -------------------------------------------------

   Initial state.
   [ 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 ]

   First write is a 7. The corresponding position
   in the status buffer is changed to previous value + 1.
   Both buffers are circular.
   [ 7 | 0 | 0 | 0 | …
Run Code Online (Sandbox Code Playgroud)

avr arduino eeprom

10
推荐指数
1
解决办法
6998
查看次数

如何告诉clang不要将寄存器保存到堆栈中?

目标

我目前正在尝试avr-llvm(支持AVR作为目标的llvm).我的主要目标是使用它希望更好的优化器(与gcc相比)来实现更小的二进制文件.如果你对AVR了解一点,你知道你只有很少的记忆.

我目前使用的是一个ATTiny45,4KB闪存和256字节(只是字节而不是KB!)的SRAM.

问题

我正在尝试编译一个简单的C程序(见下文),以检查生成的汇编代码以及机器代码大小的开发方式.我使用"clang -Oz -S test.c"来生成组件输出并优化它以实现最小尺寸.我的问题是不必要的保存寄存器值,知道这种方法永远不会返回.

我的问题......

我怎么能告诉llvm它可以破坏任何寄存器,如果需要而不保存/恢复它的内容?任何想法如何更优化它(例如更高效的堆栈设置)?

细节/示例

这是我的测试程序.如上所述,它是使用"clang -Oz -S test.c"编译的.

#include <stdint.h>

void __attribute__ ((noreturn)) main()  {
     volatile uint8_t res = 1;
     while (1) {}
}
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,它只有一个类型为uint8_t的"volatile"变量(如果我没有将它设置为volatile,那么所有内容都会被优化掉).此变量设置为1.最后有一个无限循环.现在让我们看一下程序集输出:

.file   "test.c"
    .text
    .globl  main
    .align  2
    .type   main,@function
main:
    push    r28
    push    r29
    in  r28, 61
    in  r29, 62
    sbiw    r29:r28, 1
    in  r0, 63
    cli
    out 62, r29
    out 63, r0
    out 61, r28
    ldi r24, 1
    std Y+1, r24
.BB0_1:
    rjmp    .BB0_1
.tmp0:
    .size   main, …
Run Code Online (Sandbox Code Playgroud)

optimization avr llvm clang llvm-clang

10
推荐指数
1
解决办法
2673
查看次数

为什么上传的二进制文件大小比实际大小小得多?

我只使用过AVR和MSP430,但对于这两种情况都是如此.在编译和静态链接之后,我的最终ELF二进制文件大约为208kB,而Intel Hex二进制文件大约为41kB.AVRDUDE告诉我上传大约18kB.这里到底发生了什么?

embedded avr msp430

10
推荐指数
1
解决办法
1780
查看次数

嵌入式系统的对称加密算法

寻找用于加密C中字节数组的建议和一些参考代码.问题是我必须与其他例程一起装入1KByte内存,MCU只有8MHz.所以尺寸和速度是关键.我已经检查过Rijndael,但它有很大的表用于我的MCU.基本上我要在PC上加密intel hex格式,可能只有数据区,然后在MCU中解密.

不希望使用动态内存分配例程.

我的谷歌搜索带来了所有C#实现,使用库.

更新:

解密方限制:

RAM: 512 byte
MAX code size: 512-1024 words
CPU: 8 bit, 8MHz
Run Code Online (Sandbox Code Playgroud)

c encryption embedded cryptography avr

10
推荐指数
1
解决办法
6010
查看次数

在ISR中过早"返回"会发生什么?

我正在使用AVR-GCC 4.9.2,我想知道如果我在AVR的ISR中过早返回会发生什么?

ISR(USART_RXC_vect)
{
    ...
    if(idx == BUFSIZE)
        return;
    ...
 }
Run Code Online (Sandbox Code Playgroud)

return被翻译成reti指令吗?或者我需要reti()自己加入?

我正在寻找幕后发生的事情的详细解释.

embedded avr isr

10
推荐指数
1
解决办法
860
查看次数

将原始14位二进制补码转换为有符号16位整数

我在嵌入式C中做了一些工作,加速度计将数据作为14位2的补码数返回.我将这个结果直接存储到一个uint16_t.稍后在我的代码中,我试图将这个"原始"形式的数据转换为有符号整数,以表示/使用我的其余代码.

我无法让编译器了解我想要做什么.在下面的代码中,我正在检查第14位是否已设置(意味着数字为负),然后我想反转这些位并加1以获得数字的大小.

int16_t fxls8471qr1_convert_raw_accel_to_mag(uint16_t raw, enum fxls8471qr1_fs_range range) {
  int16_t raw_signed;
  if(raw & _14BIT_SIGN_MASK) {
    // Convert 14 bit 2's complement to 16 bit 2's complement
    raw |= (1 << 15) | (1 << 14); // 2's complement extension
    raw_signed = -(~raw + 1);
  }
  else {
    raw_signed = raw;
  }
  uint16_t divisor;
  if(range == FXLS8471QR1_FS_RANGE_2G) {
    divisor = FS_DIV_2G;
  }
  else if(range == FXLS8471QR1_FS_RANGE_4G) {
    divisor = FS_DIV_4G;
  }
  else {
    divisor = FS_DIV_8G;
  }

  return ((int32_t)raw_signed …
Run Code Online (Sandbox Code Playgroud)

c embedded signed avr

10
推荐指数
2
解决办法
5099
查看次数

标签 统计

avr ×10

embedded ×4

c ×3

arduino ×2

assembly ×2

optimization ×2

atmel ×1

clang ×1

cryptography ×1

eeprom ×1

encryption ×1

htpc ×1

isr ×1

llvm ×1

llvm-clang ×1

memory ×1

msp430 ×1

signed ×1

usb ×1