从AC5向AC6迁移,已经有很多人给出了迁移的教程,AC6的编译速度着实非常有吸引力,我也尝试根据网上的教程从AC5向AC6迁移,但程序执行到printf的时候便会有问题。

有问题的重定向代码:

/* ------------------通过重定向将printf函数映射到串口1上-------------------*/
#if !defined(__MICROLIB)#pragma import(__use_no_semihosting)
void _sys_exit(int x) //避免使用半主机模式
{x = x;
}
//__use_no_semihosting was requested, but _ttywrch was
void _ttywrch(int ch)
{ch = ch;
}
struct __FILE
{int handle;
};
FILE __stdout;#endif#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{/* 实现串口发送一个字节数据的函数 *///serial_write(&serial1, (uint8_t)ch); //发送一个自己的数据到串口HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 1000);return ch;
}

要修改的地方:

  1. #pragma import(__use_no_semihosting)为AC5支持的语法格式,到了AC6不再支持改语法格式。
    在”编译器用户指导“中找到了如下内容:

    因此需要将该句内容替换为__asm (".global __use_no_semihosting\n\t");
  2. 理论上keil MDK不会定义 __GNUC__,但自从AC5改为AC6后,keil MDK中#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)便会处于高亮的模式,不知道这__GNUC__到底定义在哪了。但实际应该使用下面那条语句才对,从工程中搜索发现基本使用AC6的时候都会用到__clang__因此这里修改一下这里的判定条件defined ( __GNUC__ ) && !defined (__clang__)。这样便可以正确定位到下面应该使用的语句了。在没有改判定条件之前,如果编译的话,编译器会报一些奇怪的错误,改了判定条件后这些奇怪的错误也就没有了。
    正确的重定向printf代码:
/* ------------------通过重定向将printf函数映射到串口1上-------------------*/
#if !defined(__MICROLIB)//#pragma import(__use_no_semihosting)
__asm (".global __use_no_semihosting\n\t");
void _sys_exit(int x) //避免使用半主机模式
{x = x;
}
//__use_no_semihosting was requested, but _ttywrch was
void _ttywrch(int ch)
{ch = ch;
}
//struct __FILE
//{//  int handle;
//};
FILE __stdout;#endif#if defined ( __GNUC__ ) && !defined (__clang__)
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{/* 实现串口发送一个字节数据的函数 *///serial_write(&serial1, (uint8_t)ch); //发送一个自己的数据到串口HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 1000);return ch;
}

keil MDK AC5向AC6迁移后如何重定向printf相关推荐

  1. 实战技能分享,如何让工程代码各种优化等级通吃,含MDK AC5,AC6,IAR和GCC

    目录 引出问题: MDK设置方法(AC5和AC6): 1.开启优化后,部分功能不正常 2.开启优化后,直接整体卡死 AC5设置方法: AC6设置方法: IAR设置方法: 1.开启优化后,部分功能不正常 ...

  2. Keil MDK 中利用串口及c标准库函数printf为cortex-m3做调试输出(lpc1788)

    摘要: c标准库的printf是输出给显示器的,将printf函数进行修改,使其输出重定向至串口,就能实现目的.printf函数调用fputc函数完成实质输出单一字符的工作,因此将fputc函数修改使 ...

  3. Keil MDK 编译器 AC5 和 AC6 优化选项重要内容和区别

    关注.星标公众号,不错过精彩内容 整理:黄工 参考来源:Arm官网 使用过Keil MDK (Arm Compiler 6)编译器V6版本的读者应该发现了一个问题,V6版本速度比V5版本编译速度快很多 ...

  4. Keil MDK使用编译器AC5与AC6生成浏览信息的差异

    关注+星标公众号,不错过精彩内容 作者 | strongerHuang 微信公众号 | 嵌入式专栏 很多使用过Keil MDK的工程师都发现了一个问题,Keil MDK编译代码的时候,速度很慢. 编译 ...

  5. 【软件入门】Keil:从AC5到AC6

    Keil:从AC5到AC6 前一阵安装了新版本的Keil,搭配CubeMX使用没有出现什么问题.但是今天查看以前代码的时候发现了一个很尴尬的问题,编译莫名其妙会出现很多问题.先把问题复现一下,在后面会 ...

  6. 【STM32F429的DSP教程】第6章 ARM DSP源码和库移植方法(MDK5的AC5和AC6)

    完整版教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=94547 第6章   ARM DSP源码和库移植方法(MDK5的AC5 ...

  7. Keil MDK 5.30来了,编译性能优化,快速入门Cortex-M55

    关注.星标公众号,不错过精彩内容 素材来源:Arm Keil 编辑整理:strongerHuang 早在ARM推出Cortex-M55内核的时候,就放出来一些关于Keil MDK V5.30的消息:C ...

  8. [keil5]从AC5到AC6的转变

    具体步骤: 可以使用现成的工程修改(注意备份):1.文件更换:将你的CORE文件夹下的cmsis_armcc.h替换为cmsis_armcc_V6.h(路径:STM32Cube_FW_F1_V1.6. ...

  9. Keil MDK 又更新了啥子嘛?

    关注+星标公众号,不错过精彩内容 作者 | strongerHuang 微信公众号 | 嵌入式专栏 https://www.keil.com 打开Keil官网,可以非常容易就看到一个更新提示: 是的, ...

最新文章

  1. 2018年终总结(一只刚毕业的程序猿)
  2. 数据结构之稀疏数组 - SparseArray
  3. linux exit 源码,Linux命令——exit、sulogin、rlogin
  4. WCF 之 数据契约
  5. vue去掉#——History模式
  6. android上传图片失败问题
  7. error trying to exec 'cc1plus': execvp: 没有那个文件或目录
  8. 记一个函数定义中,形参是空列表时要注意的问题
  9. Axure RP安装破解汉化以及发布到至AxureShare
  10. SphereEx CEO 张亮:数据库上云是大势所趋|初心·问
  11. 自定义纸张重启就没了
  12. vue3获取url后面参数
  13. 如何适配处理iphoneX底部的横条 ?(转)
  14. 厦门航空谁让你如此霸王
  15. python读写tif文件
  16. 手把手教你python实现校园网自动连接,零基础也可以轻松实现
  17. SEO的外链与描文本该如何添加?
  18. java78-GUL拆分窗口
  19. as5300g2 nas软件功能_硬件与软件齐飞,首款支持2.5GbE的NAS-华芸AS-5202T测评体验
  20. 电商支付平台支付安全保障措施

热门文章

  1. Java 编写程序打印以下图形_怎么用java编写如下程序在屏幕上输出如下图形 * *** *** * 循环语句做(if语句)...
  2. 学习如逆水行舟,只有坚持不断的学习,才能保持进步!我置顶了这些公众号
  3. redis当中各种数据类型的操作
  4. 媒体查询(Media Query)
  5. php生成推广二维码海报、合成图片demo
  6. 产品通过WHQL测试认证有哪些好处?
  7. 6846. 【2020.11.02提高组模拟】旅人1970
  8. 关于风险管理,如何将思维从项目升维到项目群?
  9. 基于 Stable Diffusion 一键 AI 作画:什么“小镇做题家”?人人都是艺术家
  10. 如何使用sql语句算两经纬度的距离