标签: avr-gcc

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

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

c microcontroller stack avr avr-gcc

2
推荐指数
1
解决办法
1180
查看次数

解决makefile中"未定义的引用"错误

我的目录中有一些自定义源文件,src以及我目录中Arduino项目的一些源文件src/base.

obj使用以下make规则将所有源文件编译为存储在我的目录中的对象:

PATHOBJ := obj/
PATHSRC := src/
PATHBIN := bin/
PATHLIB := lib/
PATHTMP := tmp/
PATHARDUINO = $(PATHSRC)base/
enter code here
$(PATHOBJ)core_%.o : $(PATHARDUINO)%.c
    @mkdir -p $(dir $@)
    $(GCC) $(ALL_CORE_CFLAGS) -c $< -o $@

$(PATHOBJ)bot_%.o : $(PATHSRC)%.c
    @mkdir -p $(dir $@)
    $(GCC) $(CFLAGS)-c $< -o $@
Run Code Online (Sandbox Code Playgroud)

正如你可以看到它会编译src/tacho.cobj/bot_tacho.osrc/base/wiring_analog.cobj/core_wiring_analog.o.

在我的makefile中,我编译所有源文件没有任何问题.在其中一个文件(即src/tacho.c)中我添加了以下include: #include "base/wiring.h"其中包含原型analogRead.

有趣的是,wiring.h只包含'analogRead'功能的原型.它甚至都没有包含实际定义函数的文件,但是一些注意事项使我发现函数的定义可以在其中找到src/base/wiring_analog.c.

我认为编译声明该函数的文件并将其与所有其他必要的Arduino目标文件链接到一个库就足够了.我随意选择了它的名字lib/core.a.我lib/core.a …

reference arduino undefined avr-gcc static-linking

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

在C中更改全局变量

我在AVR芯片上运行C程序.只要听到串行信号,它就会运行串行中断ISR(USART_RX_vect).在这种方法中,它应该打开更改= 1;.然后在我的主while循环中,它应该清除LCD并显示它然后change = 0再次设置.

这是为了阻止它不断地进行计算,并在LCD上每分钟显示一百万次结果.

但是,当中断方法将更改变量更改为1时,它似乎不会"全局"更改它,并且在main方法中它始终为0 ..

这里有一些东西用于调试目的.

/* LCD DEFINES */
#define LED PB5
#define output_low(port,pin) port &= ~(1<<pin)
#define output_high(port,pin) port |= (1<<pin)
#define set_input(portdir,pin) portdir &= ~(1<<pin)
#define set_output(portdir,pin) portdir |= (1<<pin)

/* UART SERIAL DEFINES */
#define F_CPU 16000000UL
#define BAUD 9600
#define MYUBRR F_CPU/16/BAUD-1

#define STARTCHAR 'R'
#define ENDCHAR 'E'

char reading;
char inputBuffer[12];
char readStatus;
uint8_t position;
int change;

char output;
int result;

struct Axis
{
    uint8_t axisNumber; …
Run Code Online (Sandbox Code Playgroud)

c avr-gcc

2
推荐指数
1
解决办法
6855
查看次数

PID反馈和位置控制器,带直流电机/编码器

我很难让PID反馈和定位同时运行.

我计算RPM的想法是:

  1. 启动定时器并使用中断计数编码器脉冲.
  2. 使用一些简单的数学转换为RPM.
  3. 重置变量使用并重新开始.

我可以计算RPM但是我只能在计算之后调用我的PID控制器(不管我想等多久才能获得良好的分辨率.)这会导致代码非常混乱.是否有更简单的方法或我缺少的东西?

关于我的应用的信息: 我正在使用直流电机/双磁编码器编程到Atmel ATmega328P,每转约600个脉冲(齿轮箱后).我想调用GoToTarget(#)并让电机在更新PID参数时转到该位置.此外,它必须双向进行.

c embedded avr avr-gcc motordriver

2
推荐指数
1
解决办法
1987
查看次数

我怎样才能添加指向某个部分的符号?

我的C代码中有一些声明的变量__attribute__((section(".data.mystuff"))).我想定义两个符号,mystuff_startmystuff_size有部分的位置和大小.它看起来像ldLOADADDR,并SIZEOF会做我想做的,但我不想写全链接脚本.我无法弄清楚如何INSERT AFTER用来做我想做的事.

c embedded gcc ld avr-gcc

2
推荐指数
1
解决办法
654
查看次数

来自小型AVR程序的大十六进制文件

我现在正在教我的朋友如何编程AVR微控制器.我们编写了这个小程序,它发送简单的莫尔斯式代码.

问题是,在用AVR-GCC和WinAVR对其进行加工后,a.out文件几乎为30KB,十六进制文件为11KB,因此它不适合attiny2313闪存.

WinAVR CMD: avr-gcc -mmcu=attiny2313 -Os -g main.c

AVR-objcopy命令: avr-objcopy -O ihex a.out a.hex

这是代码:

#define F_CPU 8000000L
#include <avr/io.h>
#include <util/delay.h>

void light_led(int ms)
{
 PORTD |= (1 << 4);
 _delay_ms(ms);
 PORTD &= ~(1 << 4);
 _delay_ms(1000);
}

void send_char(int c)
{
 int i;
 for(i = 1; i < 8+1; i++)
 {
  if(c & i) light_led(1000);
  else light_led(500); 
 }
}

int main(void)
{
 DDRD |= (1 << 4);
 //char text[] = {'t', 'e', 's', 't'};
 int i;
 for(i …
Run Code Online (Sandbox Code Playgroud)

c microcontroller avr winavr avr-gcc

2
推荐指数
1
解决办法
1234
查看次数

avr-gcc破坏性优化

我正在使用avr-gcc 4.8.2编程Atmel ATtiny13a微控制器.

这是我的c代码:

#include <avr/io.h> 
#include <util/delay.h> 

int main(void) {
    DDRB = 1; // PB0 is output
    for (uint8_t i = 0; i < 10; i++) {
        PORTB = 1;
        _delay_ms(500);
        PORTB = 0;
        _delay_ms(500);
    }
    while(1);
}

void test(void) {
    DDRB = 1; // PB0 is output
    for (uint8_t i = 0; i < 10; i++) {
        PORTB = 1;
        _delay_ms(100);
        PORTB = 0;
        _delay_ms(100);
    }
}
Run Code Online (Sandbox Code Playgroud)

从不通过主功能调用测试功能(LED快速闪烁),因此控制器只应进入主功能(慢速闪烁).

当我编译代码时-O1,一切正常:

avr-gcc -std=gnu99 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -mmcu=attiny13 …
Run Code Online (Sandbox Code Playgroud)

c compiler-optimization avr-gcc

2
推荐指数
1
解决办法
1620
查看次数

AVR I/O 宏定义如何工作以允许访问寄存器?

我正在查看 ATmega2560 寄存器映射 ( iom2560.h) 的标头,其中包含寄存器的所有定义。例如:

#define PINA    _SFR_IO8(0X00)
//Macro definition:
#define _SFR_IO8(io_addr) ((io_addr) + 0X20)
Run Code Online (Sandbox Code Playgroud)

所以PINA是一个8位的十六进制值,对应于8位单片机寄存器的地址。当我编写代码时,我只需输入以下代码即可更改寄存器内的值:

PINA |= (1 << 3); // Setting the third bit.
Run Code Online (Sandbox Code Playgroud)

问题是:为什么我可以_SFR_IO8(0X00)通过将值赋给PINA来写入寄存器值(“由他的地址指向”)?这不是指向的寄存器的地址吗?编译器如何工作?

预先非常感谢

c atmega cpu-registers avr-gcc atmel

2
推荐指数
1
解决办法
841
查看次数

为什么函数按照定义的顺序执行,而不是按照 avr-c 中 int main() 调用的顺序执行?

我正在尝试学习 AVR C,并且正在修补 atmega328p 微控制器。我正在 Linux Mint 上使用 avr-gcc 工具链来编译我的代码并将其烧写到 Arduino 板上。

所以我尝试使用函数调用使两个 LED 灯闪烁。我制作了两个函数 - 一个用于连接到 Arduino 板的引脚 7 的闪烁 LED,另一个用于连接到 Arduino 板的引脚 13 的闪烁 LED。

这些功能正在运行,但是当我修改代码时,我注意到一个奇怪的行为。这些函数按照它们定义的顺序在 main() 之外被调用和执行;而不是按照它们从 内部调用的顺序int main()

这是我的代码

#include <avr/io.h>
#include <util/delay.h>

void blinkPin13() {
    while(1) {
        DDRB = DDRB | (1 << DDB5);
        PORTB = PORTB | (1 << PORTB5);
        _delay_ms(5000);
        PORTB = PORTB & ~(1 << PORTB5);
        _delay_ms(500);
    }
}

void blinkPin7() {
    while(1) {
        DDRD = DDRD | (1 << …
Run Code Online (Sandbox Code Playgroud)

c avr atmega avr-gcc

2
推荐指数
1
解决办法
195
查看次数

avr-objdump 使用 g++ -flto 生成不正确的输出

我使用的是带有 AVR Atmega2560 芯片的 Arduino Mega 2560。我正在使用 Windows 上的 Arduino IDE 1.8.4 对其进行编程,该 IDE 附带 avr-objdump 2.26 和 avr-g++ 4.9.2。

我的程序或多或少可以工作,但是当尝试检查生成的程序集时,objdump 似乎没有生成正确的输出。

执行中

avr-objdump -D -S -m avr:6 "arduino_build_948544\sketch\mysketch.ino.cpp.o" > mysketch.asm
Run Code Online (Sandbox Code Playgroud)

似乎成功了,但是对于像这样简单的函数

void sleep_example() {
    SMCR = 1;
    __asm__("sleep");
}
Run Code Online (Sandbox Code Playgroud)

拆卸看起来基本上是随机的:

Disassembly of section .gnu.lto__Z13sleep_examplev.af7e500a:

00000000 <.gnu.lto__Z13sleep_examplev.af7e500a>:
   0:   78 9c           mul r7, r8
   2:   63 66           ori r22, 0x63   ; 99
   4:   c0 04           cpc r12, r0
   6:   52 40           sbci    r21, 0x02   ; 2
   8:   fc 18           sub r15, …
Run Code Online (Sandbox Code Playgroud)

c++ assembly avr objdump avr-gcc

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