keil中的编译选项--C99和--gnu

1. SOEM代码中好多编译标准貌似是GNU标准,比如匿名UNION,数组大小不能开为0等等

2. 需要在Option->C/C++里的编译选项中加上“--gnu”

3. 这样会导致printf函数重定向时进的是__io_putchar函数,而这个函数目前没有找到,因此代码里没有定义,如果这里不改的话会卡死在printf函数。

4. 为了省事,暂时先将条件编译中非GNU的代码复制一下,虽然我不确定这样是否有其他问题

#ifdef __GNUC__
  /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
     set to 'Yes') calls __io_putchar() */
  //#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
	//comment_20190422: soem needs --gnu compile option,  
	#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)

#else
  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
/**
  * @brief  Retargets the C library printf function to the USART.
  * @param  None
  * @retval None
  */
PUTCHAR_PROTOTYPE
{
  /* Place your implementation of fputc here */
  /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
 
  return ch;
}

5. 改完确实printf好用了

关于GCC和GNU编译选项在printf打印串口数据中的区别,可以参考 http://blog.sina.com.cn/s/blog_dc9540b00102xd1d.html

思路都是串口重定向。

### 关于 Keil 编译器中 “弃用声明延迟” 的解决方案 在使用 Keil 编译器开发基于51单片机的应用程序时,可能会遇到一些编译警告提示“弃用声明延迟”。这种警告通常是因为某些函数或变量被标记为过时(deprecated),或者由于参数类型的不匹配引起的。 #### 一、原因分析 当 `delay` 函数或其他类似的自定义函数未明确定义其返回值类型或参数类型时,可能导致编译器发出此类警告。例如,在 C99 或更高标准下,如果函数原型缺失,则默认会假设该函数返回 `int` 类型[^1]。这可能引发潜在的兼容性问题以及不必要的警告消息。 #### 二、解决方法 以下是几种常见的处理方式: 1. **明确指定函数返回类型** 如果您的 `delay` 函数实际上并不需要返回任何数据,请将其定义为 `void` 类型以消除歧义。 ```c void delay(unsigned int time); ``` 2. **添加完整的函数原型声明** 在调用之前确保所有的外部函数都有清晰的前向声明。这样可以防止编译器猜测未知函数的行为模式并减少错误几率。 将下面这段代码放置到源文件顶部适当位置处: ```c #include "regx51.h" // 原型声明部分 void delay(unsigned int); /* 定义了一个无返回值的延时子程序 */ ``` 3. **调整项目设置中的语言选项** 可考虑更改工程配置里的C语言版本设定至更现代的标准如GNU99等支持更强特性的规范之下运行环境从而更好地解析语法结构避免旧式风格带来的困扰 4. **抑制特定类别的警告信息(谨慎操作)** 对于确实不影响最终执行效果的小毛病可以通过修改目标平台属性来关闭个别编号对应的提醒项不过这种方法治标不治本建议仅作为临时措施采用除非确认完全理解后果再行动 设置路径一般位于菜单栏 Project -> Options for Target... -> C/C++ Tab 下找到 Warning Level 字段降低等级即可达到目的但需注意平衡质量与效率之间的关系不可滥用以免遗漏真正重要的指示信号 以上就是针对此现象给出的一些可行对策希望能够帮助您顺利完成调试工作顺利推进后续环节进展 ```c #include "regx51.h" // 明确声明函数原型 void delay(unsigned int); void main() { while (1){ P1_0 = ~P1_0; // 切换P1.0状态 delay(60000); // 调用改进后的delay函数实现一定时间间隔 } } // 改良版delay函数, 使用unsigned int作为输入参数 void delay(unsigned int ms){ unsigned char i,j; for(i=ms;i>0;i--) for(j=110;j>0;j--); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值