MDK

MDK内的KEEP关键字以及$$Base $$Limit

久未见 提交于 2020-02-12 18:50:45
使用mdk编程,假如有一个有用的函数你定义了但是没有显式的调用,mdk在默认方式下,将会把这个函数从整个程序总删除掉,以节省ROM. 比如,你在ROM的0x00002000处定位了一个函数,假设为void test(void),然后使用函数指针来调用它: void (*UserProgram)(); //函数指针 UserProgram = (void (*)()) (0x00002000);//定位到指定的入口地址0x00002000 (*UserProgram)();//调用test()函数 这样做的本意是调用test()函数,但编译器并不知情,它仍会按照默认的指令将test函数给整个优化掉,因为它觉得test()函数根本没有被调用,这个时候,虽然(*UserProgram)();仍会执行,但内容与初衷已经大相径庭. 能否让编译器不自动优化test这个函数? 当然有,就是使用链接器命令:--keep=section_id 此选项指定删除未使用节时不能删除的输入节。 其中 section_id 是以下项之一: symbol 指定在删除未使用节时保留定义 symbol 的输入节。 如果 symbol 存在多个定义,则 armlink 将生成一则错误消息。 例如,您可能使用 --keep=int_handler。若要保留定义以 _handler 结尾的符号的所有节,请使用--keep

keil MDK注意事项

血红的双手。 提交于 2020-01-16 14:51:58
1.MDK中的char类型的取值范围是? 在MDK中,默认情况下,char 类型的数据项是无符号的,所以它的取值范围是0~255。它们可以显式地声明为signed char 或 unsigned。因此,定义有符号char类型变量,必须用signed显式声明。我曾读过一本书,其中有一句话:“signed关键字也是很宽宏大量,你也可以完全当它不存在,在缺省状态下,编译器默认数据位signed类型”,这句话便是有异议的,我们应该对自己所用的CPU构架以及编译器熟练掌握。 关于keil MDK工程项目设置可参考:https://blog.csdn.net/ybhuangfugui/article/details/51655502,https://blog.csdn.net/ybhuangfugui/article/details/53131141 2.赋初值的全局变量和静态变量,初值被放在什么地方? unsigned int g_unRunFlag=0xA5; static unsigned int s_unCountFlag=0x5A; 这两行代码中,全局变量和静态变量在定义时被赋了初值,MDK编译环境下,你知道这个初值保存在那里吗? 对于在程序中赋初值的全局变量和静态变量,程序编译后,MDK将这些初值放到Flash中,紧靠在可执行代码的后面。在程序进入main函数前,会运行一段库代码

Keil (MDK)中变量定义位置

被刻印的时光 ゝ 提交于 2020-01-16 14:36:54
在keil中编译程序时提示:error: #268: declaration may not appear after executable statement in block 错误, 说是声明不能在执行语句后,也就是说变量的声明写在了使用语句的后面,导致程序在编译链接时, 使用到该变量的语句找不到这个变量,故出错。 这其实与keil所采用的标准有关,Keil5(版本是5,14.2)默认采用C89标准, //报错代码 flag = 0; u16 i = 0; 这个标准要求在编写程序时变量不能放在函数体中间,只能在函数最开始定义或声明变量。如何修改呢? 方法1 将变量都放在函数最开头,且注意变量在函数体中出现的先后顺序,应该按照后面使用的顺序进行定义或声明变量,否则仍会报同样的错。 //修改代码 u16 i = 0; flag = 0; 方法2 将keil的标准改为C99,重新编译即可。如图所示,在option的C/C++标签中勾选上C99 Mode 选项(在中间右侧)。 方法3 来源: https://www.cnblogs.com/ys77/p/11541775.html

STM32F103VCT6 ST-link V2在使用MDk烧录程序时出现error: target dll has been cancelled 问题的几种解决方案

狂风中的少年 提交于 2020-01-16 02:01:49
编译环境: 开发板; St-link v2烧录器; /注意接线方式,一般接3根线就Ok了,DIO GND CLK / Mdk v5.21 /需在官网上下载对应的对应的器件支持包,注意一定要安装对应的器件pack/ 外部电源 /st-link 不能给芯片供电,需要外部电源单独供电/ 首先,检查外部接线有没有错误,板子是否没有上电,接线是否松动等等,确认硬件接线没有问题后,在修改相关设置。 KeiL相关设置: [在Debug界面中选择对应的device型号描述] [在Target界面填着对应的芯片外部晶振频率,我的芯片外部晶振是8M的。 在output界面查看对应的宏定义是否正确,_HD表示芯片为大容量flash内存,大于256K为大容量。 在debug选择硬件连接方式为st-link ,检查dialog dll是否为图中TRAMSTM.DLL. 不是的话需要手动设置,parameter设置中输入自己的芯片型号,点击右上角的setting按钮。 选择port模式为sw模式,设频率设置为1.8 在utility界面添加对应的flash文件,注意所选文件的内存大小。 设置完成,保存后退出重新编译下载,就ok啦。 来源: CSDN 作者: wangbiange 链接: https://blog.csdn.net/wangbiange/article/details/103995410

keil MDK 中使用虚拟串口调试串口

假装没事ソ 提交于 2019-12-25 21:03:25
转自: http://blog.ednchina.com/e_arm/310610/message.aspx 题目有点拗口,想利用串口调试Modbus啊,GPS啊什么的,可是手头没有硬件,怎么办?其实字节KEIL MDK和VSPD(这里两个软件网上都很容易就可以下载到破解版,如果找不到可以给我联系)就可以,这样调试串口就会很方便了。看了很多的文章,写的都很简单(其实也很简单:))。给出个详细一点的教程。 1. 利用VSPD将PC上的两个虚拟串口连接起来。如图我将COM4 和COM5连接起来。点击Addr pair。 2. 2.可以看到Virtual ports上将两个虚拟串口连接到了一起了。 3.虚拟串口准备就绪了。先将直接输入命令的方式来调试。我们打开KEIL MDK的,设置成仿真的模式。点DEBUG.在COMMAND串口输入:MODE COM4 9600, n, 8, 1 说明: MODE命令的作用是设置被绑定计算机串口的参数。基本使用方式为: MODE COMx baudrate, parity, databits, stopbits 其中: COMx(x = 1,2,…)代表计算机的串口号; baudrate代表串口的波特率;parity代表校验方式; databits代表数据位长度; stopbits代表停止位长度。 例如:MODE COM1 9600, n, 8, 1

MDK KEIL篇:

China☆狼群 提交于 2019-12-24 01:50:00
KEIL 中配置文件途径出错 在编辑C语言的时候,出现提示TOOLS.INI文件配置出错; 当我的电脑在不断提示上面的内容的时候,我一开是以为是TOOLS配置文件出错了,但是后面想到公司的电脑是加密的,很多文件在打开之后都会被加密处理。 所以将TOOLS文件进行解密处理之后,KEIL软件就可以正常读取这个配置文件了。 来源: CSDN 作者: Michael强强 链接: https://blog.csdn.net/weixin_37845646/article/details/103674039

2019-2020-1 20175234 20175205 20175217 实验二 固件程序设计

≯℡__Kan透↙ 提交于 2019-12-21 14:27:51
2019-2020-1 20175234 20175205 20175217 实验二 固件程序设计 实验内容 1-MDK 实验要求 参考云班课资源中“信息安全系统实验箱指导书.pdf “第一章,1.1-1.5安装MDK,JLink驱动,注意,要用系统管理员身分运行uVision4,破解MDK(破解程序中target一定选ARM) 提交破解程序中产生LIC的截图 提交破解成功的截图 实验步骤 按照实验指导书上的操作进行软件安装 运行 uVision4,点 File>>License Management-->复制 CID 运行keil-MDK注册机(在“Z32开发指南\2.软件资料\keil-MDK 注册机”双击“keil mdk474注册机”) 粘贴 CID 并选择 ARM。 2-LED 实验要求 参考云班课资源中“信息安全系统实验箱指导书.pdf “第一章,1.4” KEIL-MDK 中添加 Z32 SC-000 芯片库,提交安装截图 参考云班课资源中“信息安全系统实验箱指导书.pdf “第一章,1.9”完成LED实验,注意“打开Z32的电源开关前,按住Reboot按键不放,两次打开电源开关,Z32即可被电脑识别,进行下载调试。提交运行结果截图 实验报告中分析代码 实验步骤 首先先在 KEIL-MDK 中添加 Z32 SC-000 芯片库,操作过程为: 打开 keil

基于 Keil MDK 移植 RT-Thread Nano

有些话、适合烂在心里 提交于 2019-12-16 10:25:20
后文rtt代表RT-Thread 在官网公众号中,看到rtt发布了rtt nano,这个就很轻量级的rtos内核,把多余的驱动都裁剪了,因此移植工作量小,可以哪来学习一番,体验rtt之美 rtt现在也集成到cubemx5.0以上的平台,类似于freertos中间件,这个做法,倒是有点类似于大厂的风格了,看好rtt。 在keil5中,有两种方法可以移植rtt nano。 前提条件是:cubemx生成一个最小的裸机led系统。 MRTE的方法, 1、这个需要下载pack包RealThread::RT-Thread,keil有很多类似的第三方包,有ucos,freertos(这个比官网更新的都快,厉害了我的keil)rtx还是keil自带的免费rtos,这个我之前也有移植文档,也是很方便的。 安装好之后,左上方的写的小正方形,里面的rtos里面有很多选项。之前一直找不到, 是rtt的技术支持微信亲自指点的。因此需要注意。 我的选择如下: 其他的你也看到, 集成有很多rtos。 2、之后编译,会出现很多错误(重复定义之类),可以看到rtt的官网上,已经提到了,需要把很多中断Handler()注释掉,因为rtt自己已经实现了很多中断函数。 3、添加<rtthread.h>,把hal_delay()替换成rtt的延时函数,再次编译,即可一次成功。 源文件移植方法: 1、在现有的裸机工程中

MDK快速定位硬件异常位置方法,调用show caller code即可快速锁定(参考硬汉哥)

安稳与你 提交于 2019-12-12 21:46:38
今天网上看到keil中如果快速定位hardfault的方法 参考如下说明: 1. MDK的硬件异常分析主要是通过MDK调试状态进行分析的。 文档下载 apnt209.pdf (651 KB, 下载次数: 649) 2. SEGGER做的比较全面,支持GCC,IAR和MDK。 文档下载: AN00016_AnalyzingHardFaultsOnCortexM.pdf (98 KB, 下载次数: 473) 代码下载: HardFaultHandler.zip (5 KB, 下载次数: 386) 硬汉哥已经将官网的进行修改,分为两个版本 MDK IAR,分别移植到相应的平台即可, 这里添加了一个语句,在内存中写数据,这个0xc的地址应该是不允许写入的。 因此烧写到stm32中就会出现死机,调试的时候,点击停止,会定位到下面的地方 可以参考如下方法,就可以定位到我之前非法写入的代码行 来源: https://www.cnblogs.com/CodeWorkerLiMing/p/12029880.html

Keil MDK中“Image$$RW_IRAM1$$ZI$$Limit”

痞子三分冷 提交于 2019-12-12 17:07:20
ARM程序的组成 此处所说的“ARM程序”是指在ARM系统中正在执行的程序,而非保存在ROM中的bin映像(image)文件,这一点清注意区别。 一个ARM程序包含3部分:RO,RW和ZI RO是程序中的指令和常量 RW是程序中已初始化变量 ZI是程序中未初始化或初始化为0的变量 由以上3点说明可以理解为: RO就是readonly, RW就是read/write, ZI就是zero ARM映像文件的组成 所谓ARM映像文件就是指烧录到ROM中的bin文件,也成为image文件。以下用Image文件来称呼它。 Image文件包含了RO和RW数据。 之所以Image文件不包含ZI数据,是因为ZI数据都是0,没必要包含,只要程序运行之前将ZI数据所在的区域一律清零即可,包含进去反而浪费存储空间。 Q:为什么Image中必须包含RO和RW? A:因为RO中的指令和常量以及RW中初始化过的变量是不能像ZI那样“无中生有”的。 RM程序的执行过程 从以上两点可以知道,烧录到ROM中的image文件与实际运行时的ARM程序之间并不是完全一样的。因此就有必要了解ARM程序是如何从ROM中的image到达实际运行状态的。 实际上,ROM中的指令至少应该有这样的功能: 1. 将RW从ROM中搬到RAM中,因为RW是变量,变量不能存在ROM中。 2. 将ZI所在的RAM区域全部清零