Questions tagged «c»

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

9
在嵌入式C开发中使用volatile
我一直在阅读一些文章,并在Stack Exchange的答案中找到有关使用volatile关键字来防止编译器对可能以编译器无法确定的方式更改的对象进行任何优化的答案。 如果我正在从ADC读取数据(我们将其称为变量adcValue),并且将该变量声明为全局变量,那么volatile在这种情况下是否应该使用关键字? 不使用volatile关键字 // Includes #include "adcDriver.h" // Global variables uint16_t adcValue; // Some code void readFromADC(void) { adcValue = readADC(); } 使用volatile关键字 // Includes #include "adcDriver.h" // Global variables volatile uint16_t adcValue; // Some code void readFromADC(void) { adcValue = readADC(); } 我问这个问题是因为在调试时,虽然最佳实践表明(在我的情况下(直接从硬件更改的全局变量))volatile是强制性的,但我看不出两种方法之间的区别。


9
快速且高效存储的移动平均值计算
我正在寻找一种节省时间和内存的解决方案来计算C中的移动平均值。我需要避免除法,因为我使用的是没有专用除法单元的PIC 16。 此刻,我只是将所有值存储在环形缓冲区中,并在每次新值到达时简单地存储和更新总和。这确实很有效,但不幸的是占用了我的大部分可用内存...
33 pic  c 

2
什么有点撞
我是微控制器编程的新手。我正在使用ATmega32-A控制器和CodeVisionAVR编译器。我正在使用波形发生器(AD9833)通过SPI通信生成正弦波信号。我能够成功生成正弦波。现在,我将该信号传递给传感器。传感器输出通过多路复用器选择,并发送到ADC。现在,我想使用SPI通信读取ADC值。我已经尝试了很多设置ADC的寄存器。仍然无法正常工作。要查看SPI通信,请看我以前发布的使用spi通信的ADC寄存器设置。我正在使用USART(RS232)通信在PC(PuTTY)上打印值。 有人建议我使用位撞击。我是这个概念的新手。谁能给我提供SPI通信位冲击的示例代码。如何开始该程序?任何人都可以给我提供良好的物资。我需要任何外部硬件吗? 我已经写了这个,包括引脚连接: #define ADC_CS PORTB.3 #define MOSI PORTB.5 #define MISO PINB.6 #define SCK PORTB.7 void send_8bit_serial_data(unsigned char data) { int i; ADC_CS=0; for (i = 0; i < 8; i++) { // consider leftmost bit // set line high if bit is 1, low if bit is 0 if …

3
什么是微控制器的不同存储器类型?
编译后,从C代码将不同类型的数据放入不同的内存段。即:.text,.data,.bss,栈和堆。我只想知道这些段中的每一个在微控制器存储器中的位置。也就是说,给定存储器类型为RAM,NVRAM,ROM,EEPROM,FLASH等,哪些数据将进入哪种类型的存储器。 我在这里找到了类似问题的答案,但是他们无法解释每种不同内存类型的内容。 任何帮助都将受到高度赞赏。提前致谢!

2
C编码设计-函数指针?
我有一个PIC18F46K22,并使用XC8编译器对其进行了编程。最后,我将拥有一个像PC这样的系统,stdin并带有和stdout。因此,在主循环中将有一个函数来检查是否有新输入。如果有输入,将相应地调用一个函数。因此,例如,当我在A上输入A时stdin,PIC将运行类似的函数,function_A而不是function_B在我输入B时调用的函数。 当PIC完成该功能后,我希望将新输入发送到该功能。因此,当按A打开RS232发送器时,从此刻开始,所有输入都将通过RS232发送。最后,该项目是一个独立的文本编辑器。因此,当按A键打开文件系统时,此刻不再是文本编辑,而是浏览文件列表。这意味着按下“向上”和“向下”意味着与在文本编辑环境中有所不同。 我已经做了很多关于如何使用C进行编程的思考。昨晚我想了一下,想知道是否有可能,如果有可能,如何做。我想做的是: 该main函数调用类似function_A function_A将全局变量更改function_addr为函数的地址指针in_function_A 从那时起,main在function_addr有新输入时调用该函数。 所以我需要一个main检查是否function_addr为零的函数。如果是这样,应调用“正常”函数,如function_A。如果不是,function_addr则应调用at中的函数。我还需要function_A将更function_addr改为的指针in_function_A。 注意:当应关闭文件系统功能时,is_function_A应将其更改function_addr为0。 所以基本上我的问题是我怎么能 获取函数的地址(并将其存储在变量中) 在指定地址调用函数

5
裸机上的C标准库
我主要在移植Linux的设备上进行开发,因此标准C库通过实现具有标准化行为的系统调用来提供许多功能。 但是对于裸机,没有底层操作系统。是否有一个与应如何实现ac库有关的标准,或者当您切换到提供不同BSP的新板时是否必须重新学习库实现的特殊性?
24 c  library 

6
串行协议定界/同步技术
由于异步串行通信甚至在当今的电子设备中也很普遍,我相信我们许多人会不时遇到这样的问题。考虑与串行线(RS-232或类似产品)连接并且需要连续交换信息的电子设备D和计算机。即每个发送一个命令帧,并每个发送一个状态报告/遥测帧答复(报告可以作为对请求的响应发送,也可以独立发送-在这里并不重要)。通信帧可以包含任何任意二进制数据。假设通信帧是固定长度的分组。PCPCX msDY ms 问题: 由于协议是连续的,因此接收方可能会失去同步,或者只是在进行中的发送帧中间“加入”,因此它只是不知道帧起始位置(SOF)在哪里。根据数据相对于SOF的位置,数据具有不同的含义,接收到的数据可能会永久损坏。 所需的解决方案 可靠的定界/同步方案可在恢复时间短的情况下检测SOF(即重新同步所需的时间不超过1帧)。 我了解(并使用了一些)的现有技术: 1)标头/校验和 -SOF作为预定义的字节值。帧末的校验和。 优点:简单。 缺点:不可靠。恢复时间未知。 2)字节填充: 优点:可靠,快速恢复,可与任何硬件一起使用 缺点:不适用于固定大小的基于帧的通信 3)第9位标记 -在每个字节之前附加一个位,而SOF标记为1和数据字节标记为0: 优点:可靠,快速恢复 缺点:需要硬件支持。大多数PC硬件和软件未直接支持。 4)第8位标记 -上面的一种模拟,同时使用第8位而不是第9位,每个数据字仅保留7位。 优点:可靠,快速的恢复,可与任何硬件一起使用。 缺点:需要从/到常规8位表示到/从7位表示的编码/解码方案。有点浪费。 5)基于超时 -假定SOF为某个已定义的空闲时间之后的第一个字节。 优点:无数据开销,简单。 缺点:不太可靠。在较差的计时系统(如Windows PC)上无法很好地工作。潜在的吞吐量开销。 问题: 还有哪些其他可能的技术/解决方案可以解决该问题?您能否指出上面列出的缺点,可以轻松解决这些缺点,从而消除它们?您(或您将)如何设计系统协议?
24 serial  communication  protocol  brushless-dc-motor  hall-effect  hdd  scr  flipflop  state-machines  pic  c  uart  gps  arduino  gsm  microcontroller  can  resonance  memory  microprocessor  verilog  modelsim  transistors  relay  voltage-regulator  switch-mode-power-supply  resistance  bluetooth  emc  fcc  microcontroller  atmel  flash  microcontroller  pic  c  stm32  interrupts  freertos  oscilloscope  arduino  esp8266  pcb-assembly  microcontroller  uart  level  arduino  transistors  amplifier  audio  transistors  diodes  spice  ltspice  schmitt-trigger  voltage  digital-logic  microprocessor  clock-speed  overclocking  filter  passive-networks  arduino  mosfet  control  12v  switching  temperature  light  luminous-flux  photometry  circuit-analysis  integrated-circuit  memory  pwm  simulation  behavioral-source  usb  serial  rs232  converter  diy  energia  diodes  7segmentdisplay  keypad  pcb-design  schematics  fuses  fuse-holders  radio  transmitter  power-supply  voltage  multimeter  tools  control  servo  avr  adc  uc3  identification  wire  port  not-gate  dc-motor  microcontroller  c  spi  voltage-regulator  microcontroller  sensor  c  i2c  conversion  microcontroller  low-battery  arduino  resistors  voltage-divider  lipo  pic  microchip  gpio  remappable-pins  peripheral-pin-select  soldering  flux  cleaning  sampling  filter  noise  computers  interference  power-supply  switch-mode-power-supply  efficiency  lm78xx 

7
对于嵌入式代码,为什么我应该使用“ uint_t”类型而不是“ unsigned int”类型?
我正在使用gcc在c中为STM32F105编写应用程序。 在过去的(有比较简单的项目),我一直定义为变量char,int,unsigned int,等等。 我看,这是普遍使用在stdint.h中定义的类型,如int8_t,uint8_t,uint32_t,等。这是在多个API的,我使用,并且还从ST的ARM CMSIS库真。 我相信我理解为什么我们应该这样做;使编译器可以更好地优化内存空间。我希望可能还有其他原因。 但是,由于c的整数提升规则,每次尝试添加两个值,进行按位运算等操作时,我都会不断遇到转换警告,警告显示为conversion to 'uint16_t' from 'int' may alter its value [-Wconversion]。在这里和这里讨论这个问题。 使用声明为int或的变量时不会发生这种情况unsigned int。 给出几个示例,考虑到这一点: uint16_t value16; uint8_t value8; 我将不得不更改此: value16 <<= 8; value8 += 2; 对此: value16 = (uint16_t)(value16 << 8); value8 = (uint8_t)(value8 + 2); 很难看,但是如果需要的话我可以做。这是我的问题: 是否有一个地方从转换的情况下,未签名来签署和返回无符号将使结果不正确的? 使用/反对使用stdint.h整数类型还有其他重要原因吗? 根据我收到的答案,它看起来像stdint.h类型通常是优选的,既是C转换uint到int和背部。这导致了一个更大的问题: 我可以通过使用类型转换(例如value16 = (uint16_t)(value16 << 8);)来防止编译器警告。我只是隐藏问题了吗?有更好的方法吗?
22 c  embedded  gcc 

10
电子工程师的编程语言
我是一名电子与通信工程专业的学生,​​在上大学之前,我对编程和计算机应用程序很感兴趣。我曾经专注于设计Windows应用程序并学习其技术,但是现在,我觉得这对我的领域毫无用处……我不必学习有关计算机科学和开发软件的所有知识!(我对吗?) 我知道VB .Net,C#和C ++。我的假期有很多时间,所以我想以编程的方式深入研究“电子领域”。那么您会建议学习或专注于什么? 我想要在微控制器和其他集成电路编程中使用的那些语言。C ++是否足够,还是我也应该精通C?请告诉我您的想法。

6
如何在STM32上使用printf函数?
我试图弄清楚如何使用printf函数打印到串行端口。 我当前的设置是STM32CubeMX生成的代码和带有STM32F407发现板的 SystemWorkbench32 。 我在stdio.h中看到printf原型定义为: int _EXFUN(printf, (const char *__restrict, ...) _ATTRIBUTE ((__format__ (__printf__, 1, 2)))); 这是什么意思?该函数定义的确切位置在哪里?找出如何使用这种功能输出的一般要点是什么?

4
恢复出厂设置如何工作?
所有嵌入式设备都包含“恢复出厂设置”选项,如果出现问题,用户可以使用该选项重置其设备。 我正在STM32板上开发固件。该固件包括一个引导加载程序,该加载程序允许通过UART升级应用程序(通过发送包含新映像的二进制文件),我想添加另一个功能:恢复出厂设置。当用户选择此选项时,电路板应加载原始图像。 什么是出厂重置?是将整个二进制文件再次加载到内存中,还是只是调用一个函数来重新初始化最终用户修改的变量? 最佳做法是什么? 原始FW存放在哪里?是内置闪光灯还是外接闪光灯?

8
直接用C或汇编语言编写DSP算法?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 2年前关闭。 我正在使用带有交叉编译器套件CrossCore Studio的Analog Devices数字信号处理器(BF706)进行DSP项目(IIR滤波)。它具有一些简单的DSP实例,例如FIR和IIR滤波器以及其库函数。处理器手册描述了汇编指令集,没有对C进行注释。 我的问题来自于此特定应用程序,但我认为DSP开发人员应遵循最佳实践。因此,我将以一般的方式对其进行构架: 通过此DSP附带的示例,我已经意识到,如果我想使用为DSP应用设计的电路,则需要进行汇编编程以直接运行这些指令(例如乘法和加法等)。我的问题是我只是用C编程,编译器(也来自DSP芯片公司)不会为该DSP优化它并使用其功能吗?还是真的需要直接在汇编中编写DSP例程?

6
在嵌入式系统中使用全局变量
我开始为产品编写固件,我是这里的新手。我浏览了许多关于不使用全局变量或函数的文章。在8位系统中使用全局变量是否有任何限制,还是完整的“否”。如何在系统中使用全局变量,或者应该完全避免使用全局变量? 我想就此主题向大家提出宝贵的建议,以使我的固件更紧凑。
17 c  embedded  firmware 

5
在C中为模块化固件设计分配内存的可能性
模块化方法通常非常方便(便携式且简洁),因此我尝试将模块编程为尽可能独立于其他模块。我的大多数方法都是基于描述模块本身的结构。初始化函数设置主要参数,然后将处理程序(目标字符串的指针)传递给模块内部调用的任何函数。 现在,我想知道为模块描述结构的最佳分配内存方法是什么。如果可能,我想要以下内容: 不透明的结构,因此只能通过使用提供的接口功能来更改结构 多个实例 链接器分配的内存 我看到以下可能性,所有这些都与我的目标之一冲突: 全球宣言 多个实例,由链接器分配,但是struct不是不透明的 (#includes) module_struct module; void main(){ module_init(&module); } 分配 不透明的结构,多个实例,但在堆上分配 在module.h中: typedef module_struct Module; 在module.c初始化函数中,malloc并返回指向已分配内存的指针 module_mem = malloc(sizeof(module_struct )); /* initialize values here */ return module_mem; 在main.c中 (#includes) Module *module; void main(){ module = module_init(); } 模块中的声明 链接器分配的不透明结构,仅预定义数量的实例 将整个结构和内存保留在模块内部,并且永远不要公开处理程序或结构。 (#includes) void main(){ module_init(_no_param_or_index_if_multiple_instances_possible_); …
16 c  design  firmware 

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.