Questions tagged «c»

C是命令式(过程式)系统实现语言。它被设计为使用相对简单的编译器进行编译,以提供对内存的低级访问,提供可有效映射到机器指令的语言构造,并且需要最少的运行时支持。因此,C对于以前使用汇编语言进行编码的许多应用程序很有用。来自http://en.wikipedia.org/wiki/C_(programming_language)

8
为什么printf()对调试嵌入式系统不利?
我想尝试使用调试基于微控制器的项目是一件坏事printf()。 我知道您没有预定义的位置可以输出到该位置,并且它可能会消耗宝贵的引脚。同时,我已经看到人们使用UART TX引脚来通过自定义DEBUG_PRINT()宏输出到IDE终端。
16 c  debugging 

3
从C到汇编
假设对于avr-8bit,我们具有以下C代码: int v1=1; int v2=2; v2=v2+v1; 我期望以下拆卸 ldi r18, 1; ldi r19, 2; add r19, r18; 但是我跑了之后: avr-gcc -mmcu=atmega2560 Test.c -o Test.elf 和 avr-objdump -S Test.elf > Test.lss 我得到以下拆卸 ldi r24, 0x01 ; 1 ldi r25, 0x00 ; 0 std Y+2, r25 ; 0x02 std Y+1, r24 ; 0x01 ldi …
16 avr  c  assembly 

1
使用PWM产生正弦信号
我们无法使用MC68HC908GP32微控制器正确生成正弦信号。PWM说明从349页开始。时钟频率为2.4MHz,而我们通过使用预分频器并将计时器模数设置为350来使用7 kHz PWM,如下所示: T1SC = 0x60; // Prescaler: Div entre 64 //Counter modulo = 0x015E = 350 T1MODH = 0x01; // High T1MODL = 0x5E; // Low 通过以下RLC滤波器对PWM输出进行滤波,然后使用串联的1uF电容去除DC。截止频率远低于PWM的7kHz。 首先,我们尝试使用LUT,该样本是使用此站点生成的(100个样本,幅度= 250)。这包括一个时期。 int seno[100]={ 125, 133, 141, 148, 156, 164, 171, 178, 185, 192, 198, 205, 211, 216, 221, 226, 231, 235, …
16 microcontroller  c  pwm 

2
STM32F2:Makefile,链接脚本和启动文件组合,而没有商业IDE
我已经使用STM32F2(特别是开发板上的STM32F217IGH6)工作了大约两个月。到目前为止,我最大的问题与“设置”有关,其中包括makefile,链接脚本和启动文件。 特别是,我无法正确设置我的中断向量表,并且无法调用中断处理程序。ST确实提供了针对商业IDE的示例。相反,我使用了GCC工具链的免费Yagarto重新编译(以及OpenOCD通过JTAG加载图像)。 我的主板(或它的近亲)是否有示例项目,其中包含针对非商业IDE(为调用中断处理程序而设置)的适当的makefile,链接程序脚本和启动文件组合?
16 c  stm32  gcc 

4
如何在ARM Cortex A9上实现关键部分
我正在将一些旧代码从ARM926内核移植到CortexA9。此代码是裸机代码,不包含操作系统或标准库(全部自定义)。我遇到了与竞态条件有关的故障,应该通过对代码进行严格的分段来避免这种情况。 我想对我的方法提供一些反馈,以了解我的关键部分是否可能未正确为此CPU实施。我正在使用GCC。我怀疑有一些细微的错误。 另外,是否有一个开源库具有针对ARM的这些类型的原语(甚至是一个很好的轻量级的spinlock / semephore库)? #define ARM_INT_KEY_TYPE unsigned int #define ARM_INT_LOCK(key_) \ asm volatile(\ "mrs %[key], cpsr\n\t"\ "orr r1, %[key], #0xC0\n\t"\ "msr cpsr_c, r1\n\t" : [key]"=r"(key_) :: "r1", "cc" ); #define ARM_INT_UNLOCK(key_) asm volatile ("MSR cpsr_c,%0" : : "r" (key_)) 该代码的用法如下: /* lock interrupts */ ARM_INT_KEY_TYPE key; ARM_INT_LOCK(key); <access registers, …
15 c  embedded  interrupts 

3
8位MCU的C整数提升
以avr-gcc为例,将int类型指定为16位宽。在C中对8位操作数执行运算会导致由于C中的整数提升而将这些操作数转换为16位int类型。这是否意味着如果用C编写,则AVR上的所有8位算术运算都将比在C中编写的时间长得多。是否由于C的整数提升而以汇编形式编写?
14 microcontroller  avr  c 

9
为获得更好的性能而为嵌入式软件编写函数时的最佳方法是什么?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 2年前关闭。 我已经看到了一些用于微控制器的库,它们的功能一次只能做一件事。例如,如下所示: void setCLK() { // Code to set the clock } void setConfig() { // Code to set the config } void setSomethingElse() { // 1 line code to write something to a register. } 然后在它上面放其他功能,它使用此1行代码包含包含用于其他目的的功能。例如: void initModule() { setCLK(); setConfig(); setSomethingElse(); } 我不确定,但是我相信这样会在每次调用或退出函数时创建更多的跳转调用,并增加堆栈返回地址的开销。那样会使程序运行缓慢,对吗? 我已经搜索过,到处都在说编程的经验法则是,一个函数只能执行一个任务。 因此,如果我直接编写一个InitModule函数模块来设置时钟,添加一些所需的配置并执行其他操作而无需调用函数。编写嵌入式软件时,这是一种不好的方法吗? 编辑2: …

6
在嵌入式系统中使用中断时避免全局变量
对于避免全局变量的嵌入式系统,是否有一种在ISR与程序其余部分之间实现通信的好方法? 似乎一般的模式是要有一个在ISR和程序的其余部分之间共享并用作标志的全局变量,但是这种全局变量的使用对我而言是不利的。我提供了一个使用avr-libc样式ISR的简单示例: volatile uint8_t flag; int main() { ... if (flag == 1) { ... } ... } ISR(...) { ... flag = 1; ... } 我看不到本质上是一个范围界定问题。当然,ISR和程序其余部分都可以访问的任何变量必须固有地是全局的?尽管如此,我经常看到人们说的是“全局变量是实现ISR与程序其余部分之间通信的一种方式 ”(强调我的意思),这似乎暗示着还有其他方法。如果还有其他方法,那是什么?


4
STM32上的字节序问题
我正在使用arm gcc(CooCox)对STM32F4discovery进行编程,而我一直在努力解决字节序问题 我正在通过SPI使用24位ADC进行采样。由于要传入三个字节,因此MSB首先具有将它们加载到联合中的想法(无论如何,我都希望如此!),以便于使用。 typedef union { int32_t spilong; uint8_t spibytes [4]; uint16_t spihalfwords [2];} spidata; spidata analogin0; 我使用spi读取将数据加载到Analogin0.spibytes [0]-[2]中,其中[0]作为MSB,然后通过USART以8比特的高波特率将它们吐出。没问题。 当我尝试将数据传递到12位DAC时,问题就开始了。此SPI DAC需要16位字,其中包括从MSB开始的4位前缀,然后是12位数据。 最初的尝试是将ADC给我的二进制补码转换为二进制偏移量,方法是对0x8000的Analogin0.spihalfwords [0]进行异或运算,将结果移至最低12位,然后在算术上加上前缀。 令人难以置信的令人沮丧,直到我注意到对于analogin0.spibytes [0] = 0xFF和analogin0.spibytes [1] = 0xB5,analogin0.halfwords [0]等于0xB5FF而不是0xFFB5! 注意到这一点后,我停止使用算术运算和半字,并停留在按位逻辑和字节上 uint16_t temp=0; . . . // work on top 16 bits temp= (uint16_t)(analogin0.spibytes[0])<<8|(uint16_t)(analogin0.spibytes[1]); temp=temp^0x8000; // convert twos complement …
11 c  stm32  cortex-m  gcc 

2
直接从C源代码编程AVR EEPROM
在AVR C源代码中包含以下代码时,显然可以直接对保险丝进行编程,而无需额外的命令或.hex文件: #include <avr/io.h> FUSES = { .low = LFUSE_DEFAULT , .high = HFUSE_DEFAULT , .extended = EFUSE_DEFAULT , }; 在EEPROM中编程值是否有类似的技巧? 我已经检查了/usr/lib/avr/include/avr/fuse.h在哪里可以找到有关宏的一些注释,但是找不到类似的注释,/usr/lib/avr/include/avr/eeprom.h并且解释预处理器的内容有点超出我的范围了。 如果我可以在C源代码中包括默认EEPROM值,那将非常方便。有人知道如何做到这一点吗? 编辑1: 此FUSES技巧仅在ISP时执行,而不在RUN时执行。因此,在控制器中生成的汇编代码中没有对保险丝进行编程。相反,程序员会自动在额外的FUSES编程周期中循环。 编辑2: 我在Linux上使用avr-gcc和avrdude工具链。
11 avr  c  attiny  eeprom 

3
单片机睡眠竞赛条件
给定一个运行以下代码的微控制器: volatile bool has_flag = false; void interrupt(void) //called when an interrupt is received { clear_interrupt_flag(); //clear interrupt flag has_flag = true; //signal that we have an interrupt to process } int main() { while(1) { if(has_flag) //if we had an interrupt { has_flag = false; //clear the interrupt flag …

6
我的PIC16多任务RTOS内核不工作的原因是什么?
我正在尝试为PIC x16微控制器创建一个半抢占式(协作式)RTOS。在我之前的问题中,我了解到在这些内核中无法访问硬件堆栈指针。我在PIClist中查看了此页面,这就是我正在尝试使用C实现的页面。 我的编译器是Microchip XC8,当前正在使用在配置位中选择了4MHz内部RC振荡器的PIC16F616。 我了解到,可以通过查看编译器的头文件来使用C访问PCLATH和PCL寄存器。因此,我尝试实现一个简单的任务切换器。 如果我在重新启动,重置并在光标不在第一行(TRISA=0;)而不是另一行(例如ANSEL=0;)上时将调试器设置为光标后暂停调试器,则它可以在调试器中正常工作。在调试器的第一次启动中,我在以下位置获得这些消息Debugger Console: Launching Programming target User program running No source code lines were found at current PC 0x204 编辑:我不知道是什么使它起作用,但是调试器现在可以完美地工作了。因此,省略上面的输出和段落。 编辑:更改这样的主要定义使下面的代码工作。这将在程序地址处启动主要功能0x0099。我不知道是什么原因造成的。这不是一个真正的解决方案。我现在猜测存在编译器特定的错误。 void main(void) @ 0x0099 { 这是我的C代码: /* * File: main.c * Author: abdullah * * Created on 10 Haziran 2012 Pazar, 14:43 */ #include <xc.h> …

1
PIC18F4550 C编译器是开放源代码和跨平台的吗?
我是AVR的长期用户。我非常喜欢AVR-GCC可在我使用的两个主要操作系统(Mac OS X和Linux)上运行,是开源的,并受Atmel支持。我想回到PIC编程中(在90年代使用它们),因为那里有一些相当不错的PIC,例如PIC18F4550级芯片。 不幸的是,大多数用于PIC18的编译器似乎都是Windows付费的。而且他们几乎总是有我不需要的IDE。我更喜欢命令行编译器和Makefile,因此我可以通过看一个文件来了解代码是如何构建的。(而不是走过对话框的曲折迷宫) 我在SDCC上闲逛,但似乎没有PIC18F4550支持,即使有,它在网上的抱怨也听起来像是它的PIC18支持很弱,或者充其量让用户感到困惑。 那么,哪里有PIC18F4550支持的好的跨平台命令行C编译器呢? 如果失败,PIC18F4550最好的C编译器是什么?如何将其与Makefile一起使用?
11 pic  c  compiler 

1
I2C的压摆率是多少?
我正在使用C18编译器的内置功能在PIC18上配置I 2 C,如文档的第2.4节中所述: void OpenI2C2( unsigned char sync_mode, unsigned char slew ); 我不确定该怎么办slew。我可以从以下两个选项中进行选择i2c.h: SLEW_OFF:在100 kHz模式下禁用摆率 SLEW_ON:为400 kHz模式启用了摆率 在第257页的寄存器15-1中的数据表中,对这两个选项进行了更详细的说明: 1 =在标准速度模式(100 kHz和1 MHz)下禁用摆率控制 0 =为高速模式(400 kHz)使能摆率控制 我还是不明白-我有几个问题: 什么是转换率? 对我来说,这两个选项没有意义-如果我想禁用400kHz的摆率并启用100kHz,该怎么办?为什么是这样? 我应该SLEW_OFF何时选择何时SLEW_ON?
10 pic  c  i2c  software  c18 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.