烧录后 Reset And Run 重启失效

存在于 MDK ARM 5.28 之后包括 5.37 的版本. 这些版本即使勾选 Reset And Run, 在烧录后也不会自动重启执行

需要做以下设置

  • Debug -> ST-Link Debugger -> Settings
  • 切换到 Pack 标签页, 取消勾选 Enable
  • 点击 OK 保存

参考: https://community.arm.com/support-forums/f/keil-forum/44063/mdk-arm-5-28-problem-with-reset-and-run/159946

编译器版本判断失效

不能再通过__GNUC__判断是否为 gnu arm gcc toolchain, 因为 Arm Compiler 6 默认定义了 __GNUC__ , 如果用这个做宏判断, 会造成错误的代码被编译. 参考 CMSIS 的做法用 __ARMCC_VERSION 来判断

#if defined __CC_ARM
// Arm Compiler 5
#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
// Arm Compiler 6
#elif defined __GNUC__
// Normal GCC

或者

#if defined(__CC_ARM) || (defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050))
// Arm Compiler 5 or 6
#elif defined __GNUC__
// Normal GCC
#endif

关于 printf 串口输出的 retarget

用 Arm Compiler 6 的时候, printf retarget 和 Arm Compiler 5 的做法是一样的

int fputc(int ch, FILE *f)
{
return uartSendChar(ch);
} int fgetc(FILE *f)
{
return uartReceiveChar();
}

选择 Use MicroLIB 编译报错

如果勾选 MicroLIB 后 build 报错:

.\Objects\xxx.axf: Error: L6218E: Undefined symbol __use_two_region_memory (referred from startup_stm32f40_41xxx.o).
.\Objects\xxxaxf: Error: L6218E: Undefined symbol __initial_sp (referred from entry2.o).

需要重新 rebuild 一下.

具体原因查看这篇 https://chowdera.com/2022/02/202202011447342750.html

因为 keil 在你点击编译的时候只会编译内容有变动的部分(指预处理后的部分). 当你选择使用 MicroLIB 的时候, 编译器会自动添加宏定义__MICROLIB, 相对应的, 头文件中的内容就会有所改变, 导致包含了头文件的 .c 文件内容改变. 而 startup 中处存在的条件汇编语句却没有得到预处理和汇编: 被抛弃的部分是堆栈的初始化处理程序, 可以看出定义了__MICROLIB宏和没有定义时堆栈的初始化是交由不同的函数处理的. 但是编译的时候没改变这里的条件汇编, 结果没有初始化的程序了, 因此报错"符号未定义". 解决方式同样很简单, 点击重新编译即可.

编译参数变化

Language C

使用 C99

Language C++

使用 C++03

Optimization

选择 –Oz

如果选择了 AC5 的默认优化等级-O0 会导致代码执行效率低. AC6 编译器 –O0 优化等级时, n 级条件表达式可能会产生巨大的栈需求. 需要调整为–O0 以外的优化等级

安装AC5编译器

如果必须使用AC5, 需要单独安装

  • 前往https://developer.arm.com/downloads/view/ACOMP5, 选择Arm Compiler 5.06 update 7 (build 960) Win32下载
  • 运行安装包, 安装路径需要改为 C:\Keil_v5\ARM\AC506U7
  • 运行Keil MDK5
  • 打开 Manage Project Items 对话框, 切换到 Folders / Extensions 对话框, 在 User Arm Compiler 右侧点开浏览按钮, 在弹出的对话框中, 点击 Add Another ARM Compiler Version to List, 定位到刚才安装的路径
  • 保存后, 在 Config Target Options 对话框中, 就能看到 Use default compiler version 5 选项了

升级 MDK 5.37 后的问题处理: AC6编译选项, printf, 重启失效等的更多相关文章

  1. SharePoint 2010升级到sharePoint 2013后,人员失去对网站的权限的原因及解决方法。The reason and solution for permission lost after the upgrading

    昨天碰到了一个问题,一个网站在从SharePoint 2010升级到SharePoint 2013后,人员都不能登录了,必须重加赋权,人员才能登录,这样非常麻烦. 原因:是认证方式的问题.在Share ...

  2. 升级10.11.6后CocoaPods的坑,之前10.11.4已经安装好的,居然没了Failed to locate Homebrew!

    升级10.11.6后CocoaPods的坑,之前10.11.4已经安装好的,居然没了,用命令 sudo gem install cocoapod 装不上,换 sudo gem install -n/u ...

  3. 升级xcode6和ios8后,unity遇到的一些小问题

    升级最新的Xocde6后,如果不是最新版本的unity,虽然也可以也可以正常的build,但如果想通过unity连真机进行profile的话,就会在xocde中报错,这个的主要原因是unity的配置里 ...

  4. xcode7.3 升级 xcode8.0 后权限设置问题(升级xcode 8.0 后构建版本不显示问题)

    xcode7.3 升级 xcode8.0 后权限设置问题(升级xcode 8.0 后构建版本不显示问题) 前两天为了适配 iOS10 的系统 我将xcode 7.3 升级到了 xcode 8.0 但是 ...

  5. DZ升级到X3.2后,UCenter用户管理中心进不了了

    前天将DZ升级到X3.2后,UCenter用户管理中心进不了了,输入的密码也对,验证码也对,就是点登录后没反应,又回来输入前的状态.如果更换密码后,显示密码错误,证明密码是没错的.但就是进不了.大家看 ...

  6. 升级3.2.3后 could not find driver

    求解,之前一切正常,升级3.2.3后提示找不到数据库驱动我用的是mysql,也没有设置DB_DSN错误位置FILE: C:\Users\Administrator\workspace\test\Thi ...

  7. thinkjs升级到3.0后的图片上传

    似乎当thinkjs升级到3.0后,才接手了一个项目.只是在实际运用过程中,还是发现了与2.2的些许差别——今天先分享关于图片上传的一些问题. 1.上传文件,我们选择了jQuery的插件:http:/ ...

  8. 排错-升级Exchange 2013 CU22后程序名称显示异常

    近期在按需更新Exchange 2013 CU22补丁以便解决Microsoft Exchange Server ADV190007 Guidance for "PrivExchange&q ...

  9. CentOS6.5把MySQL从5.1升级到5.6后,MySQL不能启动

    解决了:进入mysql安装目录 cd /var/lib/mysql删除了如下三个文件:ibdata1  ib_logfile0  ib_logfile1 CentOS6.5把MySQL从5.1升级到5 ...

  10. springboot 1.3.5升级1.5.9后 默认使用tomcat 8.5版本 get请求报400 异常信息为 The valid characters are defined in RFC 7230 and RFC 3986

    1.springboot 1.3.5升级1.5.9后 默认使用tomcat 8.5版本而之前用的是tomcat7    get请求报400 异常信息为 The valid characters are ...

随机推荐

  1. CSS 动画 : 3D翻页动画

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. 【面试题精讲】Redis如何实现分布式锁

    首发博客地址 系列文章地址 Redis 可以使用分布式锁来实现多个进程或多个线程之间的并发控制,以确保在给定时间内只有一个进程或线程可以访问临界资源.以下是一种使用 Redis 实现分布式锁的常见方法 ...

  3. 汉字在unicode的编码情况-From http://yedict.com/zsts.htm

    字符集内容 字数 unicode编码 字符显示说明(除非安装更大字库) 基本区  分页:  一 二 三 四 共20902字 4E00-9FA5 电脑和手机都能显示 基本区补充 共90字 9FA6-9F ...

  4. [转帖]armv6、armv7、armv7s、armv8、armv64及其i386、x86_64区别

    ARM处理器指令集 一. 苹果模拟器指令集: 指令集 分析 i386 针对intel通用微处理器32架构的 x86_64 针对x86架构的64位处理器 i386|x86_64 是Mac处理器的指令集, ...

  5. 【转帖】【ethtool】ethtool 网卡诊断、调整工具、网卡性能优化| 解决丢包严重

    目录 即看即用 详细信息 软件简介 安装 ethtool的使用 输出详解 其他指令 将 ethtool 设置永久保存 如何使用 ethtool 优化 Linux 虚拟机网卡性能 ethtool 解决网 ...

  6. CentOS确认网口是否插入网线的办法

    最近公司的机器存在网络问题, 部分网络总是不通, 比较奇怪. 最近一直想处理好. 第一步: 先查看网口的设备信息 可以使用 ip link show 可以讲网口信息都展示出来. 一般情况下  NO-C ...

  7. Semantic Kernel 通过 LocalAI 集成本地模型

    本文是基于 LLama 2是由Meta 开源的大语言模型,通过LocalAI 来集成LLama2 来演示Semantic kernel(简称SK) 和 本地大模型的集成示例. SK 可以支持各种大模型 ...

  8. 微信小程序之某个节点距离顶部和底部的距离 createSelectorQuery

    这个方法可以用来在上滑滚动的时候,让某一个区域置顶, 在下滑的时候,又变为原来的位置哈! <huadong :class="{'hident':isFixed}" id=&q ...

  9. 从零开始配置 vim(6)——缩写

    关于vim能快速编辑文本的能力,我们见识到了 operator + motion ,见识到了. 范式和宏.甚至可以使用命令来加快文本编辑.在后面我们又介绍了快捷键绑定来快速执行我们想要的操作.今天我们 ...

  10. 手撕Vue-实现将数据代理到Vue实例

    前言 经过上一篇文章的学习,完成了 v-on 指令的实现,接下来我们来实现将数据代理到 Vue 实例上. 为什么要完成这个功能呢?因为我们在使用 Vue 的时候,可以直接通过 this.xxx 的方式 ...