在我的AVR上,我有一个字符数组,它以{R,G,B,x,R,G,B,x,...}的形式保存颜色强度信息(x是未使用的字节).有没有简单的方法来写一个long int(32位),char myArray[4*LIGHTS]所以我可以轻松写一个0x00BBGGRR数字?
我的类型转换是粗糙的,我不知道如何写它.我猜测只是制作一个指向long int类型的指针并将其设置为等于myArray,但后来我不知道如何随意告诉它将group x设置为myColor.
uint8_t myLights[4*LIGHTS];
uint32_t *myRGBGroups = myLights; // ?
*myRGBGroups = WHITE; // sets the first 4 bytes to WHITE
// ...but how to set the 10th group?
Run Code Online (Sandbox Code Playgroud)
编辑:我不确定类型转换是否是正确的术语,因为我认为如果它只是将32位数字截断为8位?
我有一些代码需要每2分钟运行一次,看起来很简单.问题似乎是从计时器中触发一个长时间运行的进程导致计时器摇摆不定?有什么建议.
我的C知识不是很好,所以请帮我解决一些基本想法.MCU是Atmel Mega128L
长时间运行的过程是通过Telit GSM设备(通过UART1)的http呼叫,这本身很好用,但需要在主循环中运行,因为它需要监视其他进程.
我刚刚开始在 AVR-GCC 中尝试使用内联汇编器。我正在研究一个宏,它将两个 8 位无符号整数相乘并将结果存储在一个 16 位无符号整数中,用于没有硬件乘法的 AVR,其速度比使用标准 C 函数更快。代码是:
#ifndef UMULTFIX_H_
#define UMULTFIX_H_
#include <inttypes.h>
#define umultfix(a,b) \
({ \
uint16_t product; \
uint8_t multiplier = a, multiplicand = b, count = 9;\
asm volatile ( \
"mov %A0, %1 \n\t" \
"ldi %B0, 0 \n\t" \
"clc \n\t" \
"mult: ror %B0 \n\t" \
"ror %A0 \n\t" \
"dec %3 \n\t" \
"breq end \n\t" \
"brcc mult \n\t" \
"clc \n\t" \
"adc %B0, %2 \n\t" \ …Run Code Online (Sandbox Code Playgroud) 我有一个AT90USB162 AVR芯片,我想运行多任务RTOS,所以我正在评估可能的RTOS与我的AVR芯片一起使用.AVR支持哪些多任务RTOS?也许是QNX?(是否可以在AVR微芯片上运行QNX内核?).
提前致谢.
有谁知道如何从Mac OS X中完全删除OSX-AVR?我需要更新的avr-gcc支持,所以我将安装CrossPack for AVR,但我不希望任何冲突在我的系统中有多个avr-gcc.我还没有找到任何关于卸载OSX-AVR的文档,所以我不知道如何摆脱一切.
谢谢,
我对avr-gcc有一个奇怪的问题.如果我这样做:
int i = 0;
i = ++i;
Run Code Online (Sandbox Code Playgroud)
它导致编译器警告:
warning: operation on ‘i’ may be undefined
Run Code Online (Sandbox Code Playgroud)
这有什么不对?
如果它被重写为
i = i + 1;
Run Code Online (Sandbox Code Playgroud)
它不会导致警告.
avr-gcc是版本4.3.4,我在Ubuntu 10.04上运行它.
这是符号连接在C中完成的方式.
#define conc(a,b) a ## b
例如:
conc(hello,World)将成为符号helloWorld.
我需要知道的是有点不同.假设有一个n包含整数的变量.现在我需要通过将另一个符号与值相 连接来创建符号n.
例如:
n = 2
我需要定义一些function(...),这样function(symbol,n)会给symbol1(不symboln)和时n = 3,function(symbol,n)会给symbol3等等...
我该如何定义类似的东西?
这就是我真正想要实现的目标.首先,这将用于AtmelStudio编程atmega微控制器.那里有4个USART模块,因此是一组独立的寄存器,只能通过模块的编号来改变名称.
例如,在四个模块的四个波特率寄存器是UBRR0L,UBRR1L,UBRR2L,UBRR3L.(还有几个,见下文).

我需要编写一个函数来通过设置相关寄存器的值来初始化给定模块.由于寄存器名称仅因模块编号而异,如果我可以按照本文中的要求定义一些预处理器指令,我可以用一些符号编写一个表示寄存器名称的函数,因此符号将带有相关的寄存器名称和事情会好起来..
例如:
如果我可以定义conc(a,b)做我需要的,一个简单的功能
void init(int no){
conc(UBRR,no) = 0xF0;
}
Run Code Online (Sandbox Code Playgroud)
将能够用来代表以下所有内容;
UBRR0 = 0xF0;
UBRR1 = 0xF0;
UBRR2 = 0xF0; …Run Code Online (Sandbox Code Playgroud) 我有一个头文件lcd.h(缩短):
#pragma once
// ...
const uint8_t LCD_ROW_ADDR[] = {0x00, 0x40, 0x14, 0x54};
// ... other prototypes and macros...
Run Code Online (Sandbox Code Playgroud)
以及使用lcd.c此变量的文件:
#include <stdbool.h>
#include <stdint.h>
// ...
#include "lcd.h"
// ...
/** Set cursor position */
void lcd_xy(const uint8_t x, const uint8_t y)
{
lcd_set_addr(LCD_ROW_ADDR[y] + (x));
}
Run Code Online (Sandbox Code Playgroud)
包括我 lcd.h在main.c,并lcd.c分别在使用makefile编译.
我收到这个错误:"LCD_ROW_ADDR'的多重定义"
avr-gcc -std=gnu99 -mmcu=atmega328p -DF_CPU=16000000UL -I. -Ilib/ -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wno-main -Wno-strict-prototypes -Wno-comment -g2 -Wextra -Wfatal-errors -ffunction-sections -fdata-sections -Wl,--gc-sections -Wl,--relax …Run Code Online (Sandbox Code Playgroud) 我想分配2D数组,我正在考虑两种可能性(Arduio上的avr-gcc):
A:
int **arr = new int*[5];
for(int i = 0 ; i < 5 ; i++){
arr[i] = new int[10];
}
Run Code Online (Sandbox Code Playgroud)
B:
int **arr = malloc(5 * sizeof(int *));
for(int i = 0 ; i < 5 ; i++) {
arr [i] = malloc(10* sizeof(int))
}
Run Code Online (Sandbox Code Playgroud)
A和B之间有什么区别吗?编译器会在这两种情况下创建相同的字节代码(arv-gcc)吗?
#include <avr/io.h>
#include <avr/interrupt.h>
int main()
{
DDRB|=0x82;
DDRC=0x00;
DDRD=0xFF;
TCNT1H=(-640)>>8;
TCNT1L=(-640);
TCCR1A=0X00;
TCCR1B=0X01;
TIMSK=(1<<TOIE0)|(1<<TOIE1)
sei();
PORTD=PINC;
}
ISR(TIMER1_OVF_vect)
{
TCNT1H=(-640)>>8;
TCNT1L=(-640);
PORTB^=0X80;
}
Run Code Online (Sandbox Code Playgroud)
请帮我解决TCNT1H=(-640)>>8; TCNT1L=(-640);代码....因为我一直在使用0-256的值,所以真的很混乱....