Questions tagged «gcc»

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 

5
Code Sourcery G ++ Lite仍然是可行的项目吗?
当我尝试下载适用于ARM的Code Sourcery G ++ Lite的较新版本时,我注意到我被重定向到另一家公司,并且在该网站上真的找不到有关ARM Sourcery G ++ Lite的任何信息。 有人知道Sourcery G ++ Lite for ARM项目的状态吗?它还活着吗,人们还在使用它吗?将来会上市吗? 更新:他们似乎已将项目重命名为Sourcery CodeBench Lite,所以也许这个问题不重要? 更新:Mentor Graphics正在关闭该项目,它不再是可行的选择。 注意:当前获得ARM gcc的可行地方似乎来自Linaro https://www.linaro.org/about/ https://www.linaro.org/downloads/ https://launchpad.net/gcc-arm-embedded
18 arm  compiler  gcc 

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

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 

3
Eclipse + GNU ARM + STM32-HAL或SPL
我将开始进行ARM开发(经过2年的AVR),并选择了带有stm32f4微处理器的STM DISCOVERY板。 我决定使用eclipse + ARM gcc,因为我不喜欢Keil上的代码限制,而且我没有钱来获得付费版本。 按照教程,我已经将eclipse与gcc ARM工具+ openocd + make utils一起安装了。 我的问题是关于“包装”插件的。像每个初学者一样,对于使用新的STM HAL还是旧的SPL感到困惑。 我的理解是HAL已经将抽象实现到了可以称为arm的Arduino等效级别。另一方面,SPL提供了足够的抽象来提高编码速度,但是您仍然需要处理芯片级的问题。 有了这种了解,我想坚持使用SPL来更好地理解事物,而不是使用HAL。 我想知道的是,是否为STM使用软件包会隐式迫使我使用HAL?如果是这样,有人可以指出我如何在我的设置中使用SPL吗?
10 arm  stm32  gcc  cortex  hal-library 

4
为什么GCC编译器会省略一些代码?
我不明白为什么GCC编译器会在保留附近绝对相同的代码的同时删掉部分代码? C代码: #define setb_SYNCO do{(PORTA|= (1<<0));} while(0); ISR(INT0_vect){ unsigned char i; i = 10; while(i>0)i--; // first pause - omitted setb_SYNCO; setb_GATE; i=30; clrb_SYNCO; while(i>0)i--; // second pause - preserved clrb_GATE; } LSS的相应部分(汇编文件,由编译器创建): ISR(INT0_vect){ a4: 1f 92 push r1 a6: 0f 92 push r0 a8: 0f b6 in r0, 0x3f …
9 avr  c  avr-gcc  optimization  gcc 

2
将嵌入式编程从Keil移至Linux
我目前正在使用Keil开发STM32发现板。我的项目即将完成,我想迁移到基于Linux的构建环境。我一直在使用预配置的刷新工具和用于Windows的STLink驱动程序来刷新电路板,并且让keil导出了bin文件,我设法使用qSTLink2在Linux机器上刷新了该文件。到目前为止,一切都很好。 现在,我一直在坚持构建整个项目的过程。特别: 如何将.uvproj移植到makefile中,同时考虑诸如“ startup_stm32l1xx_md.s”启动文件之类的内容?
9 stm32  linux  gcc  keil 
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.