这是Eclipse中控制台的输出:
**** Build of configuration Debug for project FatFstest ****
make all
make: *** No rule to make target `main.o', needed by `FatFstest.elf'. Stop.
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用Eclipse的AVR插件构建一个项目来测试FatFs库.我首先导入了FatFs代码,然后创建了main.c文件来实现它.在我第一次尝试构建它之后,我将项目的src文件夹添加到Properties> AVR Compiler> Directories中的目录列表中,我仍然得到构建错误.有帮助吗?
这是我的makefile:
################################################################################
# Automatically-generated file. Do not edit!
################################################################################
-include ../makefile.init
RM := rm -rf
# All of the sources participating in the build are defined here
-include sources.mk
-include subdir.mk
-include src/subdir.mk
-include objects.mk
ifneq ($(MAKECMDGOALS),clean)
ifneq ($(strip $(C_DEPS)),)
-include $(C_DEPS)
endif
ifneq ($(strip $(ASM_DEPS)),)
-include $(ASM_DEPS)
endif
ifneq …Run Code Online (Sandbox Code Playgroud) 我目前正在研究一个项目,碰巧我必须颠倒一个字节的顺序.我目前正在使用AVR Studio Mega32微控制器.
例如:
0000 0001 becomes 1000 0000
0001 0110 becomes 0110 1000
1101 1001 becomes 1001 1011
Run Code Online (Sandbox Code Playgroud)
首先,我有这个:
ldi r20,0b00010110
Run Code Online (Sandbox Code Playgroud)
反转字节的最简单方法是什么,使r20变为01101000?
我在AVR32上有一个中断服务路由.我需要从中断状态寄存器中读取以取消中断.但是我没有使用读取的结果.我宁愿不使用asm指令,但我担心gcc会将读取优化为虚拟变量.什么是正确的方法?
目前我有:
uint32_t tmp = *(volatile uint32_t *)INTERRUPT_STATUS_REG_ADDRESS;
Run Code Online (Sandbox Code Playgroud)
tmp也应该波动吗?我担心如果没有使用tmp,gcc会跳过读取.
我编写了以下结构,用于我正在制作的Arduino软件PWM库,一次PWM(在Uno上)或70个引脚(在Mega上).
如上所述,处理此结构数组的代码的ISR部分(eRCaGuy_SoftwarePWMupdate())需要133us才能运行.但是,非常奇怪的是,如果我取消注释"byte flags1"这一行 (在结构中)虽然flags1尚未在任何地方使用,但ISR现在需要158us才能运行.然后,如果我取消注释"byte flags2;" 为了使BOTH标志现在不被注释,运行时会回落到之前的状态(133us).
为什么会这样?!?我该如何解决?(即:我想确保一致的快速代码,对于这个特定的功能,而不是令人费解的变幻无常的代码).添加一个字节会大大减慢代码速度,但添加两个字节根本不会发生任何变化.
我正在尝试优化代码(我还需要添加另一个功能,需要单个字节用于标志),但我不明白为什么添加一个未使用的字节会使代码减慢25us,但添加两个未使用的字节并不会t根本改变运行时间.
我需要了解这一点,以确保我的优化始终如一.
在.h文件中(我的原始结构,使用C风格的typedef'ed结构):
typedef struct softPWMpin //global struct
{
//VOLATILE VARIBLES (WILL BE ACCESSED IN AND OUTSIDE OF ISRs)
//for pin write access:
volatile byte pinBitMask;
volatile byte* volatile p_PORT_out; //pointer to port output register; NB: the 1st "volatile" says the port itself (1 byte) is volatile, the 2nd "volatile" says the *pointer* itself (2 bytes, pointing to the port) is volatile.
//for PWM output:
volatile unsigned …Run Code Online (Sandbox Code Playgroud) 在调试会话期间,我发现snprintf在使用avr-gcc编译代码时无法按预期工作.示例代码应该简单地将浮点值3999.9f转换为其字符表示形式.
这是一个最小的测试用例:
int TestSnprintf(void)
{
const float inputValue = 3999.9f;
/* Print with a fixed width of 6 characters (5 numbers and 1 dot).
The buffer must have a length of 7, because snprintf appends a '\0' at the end. */
char buf[7U] = {0, 0, 0, 0, 0, 0, 0};
const uint8_t bufferSize = 7U;
if(6 != snprintf(buf, bufferSize, "%06.1f", inputValue))
{
return -1;
}
if( buf[0] != '3'
|| buf[1] != '9'
|| buf[2] …Run Code Online (Sandbox Code Playgroud) 我一直在考虑"继续"进行MCU编程,但问题是我从未使用过任何微控制器或类似产品.据我所知,AVR和PIC是业余爱好者中最常见的微控制器,显然大多数人建议AVR为像我这样的新手,因为它的"C友好架构"(无论这意味着什么),它的C编译器及其大型业余爱好者社区.AVR或PIC或其他任何东西,对我来说并不重要,我希望能够在Linux上用一个好的编译器编写C代码,并最终能够在我的MCU上添加一个LCD屏幕(只是为了输出基本的ASCII字符,也许在这里和那里画几个像素,单色,没什么大的).我不需要任何复杂或极快或甚至大量的记忆,因为我喜欢有限(但不是太有限)的事情,你需要一些创造力来实现目标.我在互联网上环顾四周,但我发现的大多数页面已经有几十年的历史了,并且/或者没有提出我可以购买的任何好的'包'(这将支持上面提到的内容).这就是为什么我问你,希望你能帮助我一点.:)
谢谢,霍法.
除了默认的C++环境之外,哪些编程语言或环境以Arduino或AVR为目标?
PS:我正在使用Mac OS 10.5.
首先是一些背景.在微小的数据中,数据可以存储在寄存器,sram,eeprom或程序空间中.寄存器和sram是易失性存储,而eeprom和程序空间则不是.(即:未通电时数据停留.)
在c中编程时(使用avr-gcc库),典型代码可能如下所示:
#define F_CPU 8000000UL
#include <inttypes.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <avr/eeprom.h>
//This data is put in the eeprom
const uint8_t dat_eeprom EEMEM= 0xab;
//This data is put in the program space
const uint8_t dat_pgm_space PROGMEM= 0xcd;
//This data is stored in the sram
uint8_t dat_sram = 0xef;
int main(){
while(1){
;;
}
}
Run Code Online (Sandbox Code Playgroud)
编译:
avr-gcc -g -mmcu=attiny44 -o test.elf test.c
Run Code Online (Sandbox Code Playgroud)
并从.elf中提取intel .hex:
avr-objcopy -j .text -j .data -O ihex test.elf test.hex
Run Code Online (Sandbox Code Playgroud)
我们得到以下test.hex:
:1000000011C023C022C021C020C01FC01EC01DC0FF
:100010001CC01BC01AC019C018C017C016C015C01C
:1000200014C0CD0011241FBECFE5D1E0DEBFCDBF8F
:1000300010E0A0E6B0E0EAE5F0E002C005900D9225
:10004000A236B107D9F702D006C0DACFCF93DF933B
:0A005000CDB7DEB7FFCFF894FFCF65 …Run Code Online (Sandbox Code Playgroud) 首先,我想说我是崇高文本编辑器的新手,我喜欢它.我没有使用JSON的经验,但它看起来并不困难.
我正在尝试编写一个构建系统,它将调用一个bash脚本,将一个makefile移动到我正在工作的目录中并调用makefile,它将使用avr-gcc编译我的c代码然后使用它将其闪存到连接的微控制器上AVRDUDE.
我意识到sublime text 2只能有一个"cmd"对象,所以我尝试从终端模拟器调用一行中的所有东西,它完全符合我的预期.电话是:
checkAVRmakefile.sh $PWD; make PROJECTNAME+=hello install
Run Code Online (Sandbox Code Playgroud)
我的脚本位于我的$ PATH环境变量的目录中,我将它传递给我正在使用的目录,因此它在那里检查makefile,如果它不存在,则从我保留所有目录的目录中复制它我的makefile.然后我调用make并将其命名为I,并调用该项目并安装闪存avr微控制器.
我用崇高做的是这样的:
{
"shell":true,
"cmd":[ "checkAVRmakefile.sh", "$file_path", ";" ,"make","PROJECTNAME+=$file_base_name","install"],
}
Run Code Online (Sandbox Code Playgroud)
这只运行bash脚本,它将makefile放在目录中但不运行make.
有谁看到我哪里出错了?
任何帮助表示赞赏.我也在崇高的论坛上问过类似的问题,但没有人回答.我也在Ubuntu上使用ST2.
你好堆栈溢出的人.我的问题是一个看似永远不会执行的中断服务程序(ISR)!以下是我设置的一些信息:我正在闪烁avr attiny85.到目前为止,我只使用main.c和两个模块设置项目的基础:timer和hardwareInit.在定时器模块中,我有一个timer0_init函数,我用它来设置Timer0以使CTC模式在1 ms内溢出.这是功能:
void timer0_init( void )
{
cli();
TCCR0B |= 3; //clock select is divided by 64.
TCCR0A |= 2; //sets mode to CTC
OCR0A = 0x7C; //sets TOP to 124 so the timer will overflow every 1 ms.
TIMSK |= 2; //Enable overflow interrupt
sei(); //enable global interrupts
}
Run Code Online (Sandbox Code Playgroud)
设置定时器后,每次计数器溢出时我都会添加一个ISR来增加滴答,这样我就可以跟踪已经过了多长时间等等.
ISR(TIMER0_OVF_vect)
{
cli();
//ticks ++;
PORTB |= ( 1 << PORTB0 );
sei();
}
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,我注释掉了滴滴答用器因为它没有工作,并用PORTB |= ( 1 << PORTB0 );简单的LED打开就取而代之,所以如果中断被执行,我会通过证明LED亮起来知道.
不幸的是,我无法让它打开,看不到我错过的东西.(为了证明我1.将LED设置在右侧引脚上,并且2.正在操作正确寄存器中的正确位,我将此声明PORTB |= ( 1 …