图4.2.2 查看STM32内部使用情况
另可参看:之二、C语言程序的存储区域。
2)ARM映像文件的组成
所谓ARM映像文件就是指烧录到ROM中的bin文件,也成为image文件。以下用Image文件来称呼它。 Image文件包含了RO和RW数据。之所以Image文件不包含ZI数据,是因为ZI数据都是0,没必要包含,只要程序运行之前将ZI数据所在的区域一律清零即可。包含进去反而浪费存储空间。
ARM程序的执行过程:
从以上两点可以知道,烧录到ROM中的image文件与实际运行时的ARM程序之间并不是完全一样的。因此就有必要了解ARM程序是如何从ROM中的image到达实际运行状态的。
实际上,RO中的指令至少应该有这样的功能:
(1)将RW从ROM中搬到RAM中,因为RW是变量,变量不能存在ROM中。启动过程另可见。
(2)将ZI所在的RAM区域全部清零,因为ZI区域并不在Image中,所以需要程序根据编译器给出的ZI地址及大小来将相应得RAM区域清零。ZI中也是变量,同理:变量不能存在ROM中。
在程序运行的最初阶段,RO中的指令完成了这两项工作后C程序才能正常访问变量。否则只能运行不含变量的代码。
------------------------
更为详细的讲解搜索百度云盘“嵌入式网络那些事LwIP协议深度剖析与实战演练”的第三章3.1.4 ARM连接器。
一个映像文件(image)一般由一个或多个域组成,而往往在image中的位置同域在实际存储器的的位置俱有对应关系。
图4.2.2
3)ARM映像文件的存储地址映射
图4.2.3 存储地址映射
图5.0.1 配置Flash
----------------------------------------------
图5.1.1 Devie设置
图5.2.1 Target设置
图5.3.1 Output设置
图5.4.1 Listing设置
图5.5.1 User设置
图5.6.1 C/C++设置
图5.7.1 Asm设置
图5.8.1 Linker设置
图5.9.1 Debug设置
图5.10.1 Utilities设置
图6.0.1 生成.bin文件
图6.1.1
在“ProjectLIST目录下方”。
命令:fromelf.exe --bin -o "$" "#L"
图6.3.1
编译后的输出结果:
图6.3.2
在使用KEIL的时候,我们要使生成的hex文件转化成bin文件,方便下载或fireware更新,有时候看到的是一个目录,遇到这种情况是什么问题呢!
比如说这个命令:fromelf.exe --bin -o "$" "#L", 这个也许就生成了一个bin目录文件,这个是为什么呢?
首先看一下链接脚本,发现里面有几个段的定义,其实我们需要的只是代码段,那么我们只需要修改这条命令为:
fromelf.exe --bincombined -o "$" "#L",把--bin 改成 --bincombined, 这样子我们就达到了我们所需要的bin文件,它可以把多个负载段生成一个输出文件。
另可参考:STM32标准库编译成lib库文件、如何将C文件生成静态库。
1、打开一个测试通过的工程
如果本来要打包的库文件里面的代码有错的话,打包成库后也是不能用的,这步是关键。
图7.1.1
测试没有问题后将不需要的部分删除
图7.1.2
2、打开KEIL MDK->Project->Option for target...->Output,选 中Create Executable:....选项
图7.2.1
3、切记:需要重新编译,即可在原本生成Hex文件的目录下找到*.lib文件
4、打开原工程,只需将原来的dsp_g2.c文件移除,添加进该.lib文件即可使用
5、使用指令生成.lib文件(Keil C51测试通过)
1)在编译通过的工程目录里找到delay1s.obj和delay5ms.obj文件,复制到Keil安装目录下的BIN文件夹内。
图7.5.1
----------------------
2)打开上图中突显的LIB51.EXE。在上面输入以下代码:
图7.5.2
----------------------
3)这时在BIN中就出现了mylib.lib文件,它已经被添加了之前的两个延时程序。
图7.5.3
----------------------
4)复制这个库到LIB中,并添加进该.lib文件即可使用
使用指令生成.lib文件在Keil MDK中测试没有通过。
6、C文件生成静态库(如何将C文件生成静态库)
1)中文注释代码乱码
在新版本的KEIL中,总有人反映中文注释会出现乱码。出现这种情况,对于中文注释程序的人来说,无疑是一件十分不爽的事情。但实际解决这个问题其实很简单,在Edit/Configuration里如下图:
图8.2.1
这个是view菜单的最后一下configuration的界面,在蓝色选中的部分选择GB2312,如图:
图8.2.2
这时候,编辑文档里的删除文字和退格操作都是按照中文编码了,不再会出现乱码的情况。
2)
图8.3.1
图8.3.2
设置一下代码补全功能。
程序中加入“#include "complex.h"”报需要“C99 mode or gnu mode”
图8.4.1
图9.1.1
比如在仿真环境,watch中添加的变量不能随着代码的运行而实时更新,需要勾选“Periodic Window Update”。
图9.2.1
图9.4.1
使用printf打印输出到串口,可以查看程序的执行状态。在没有仿真器或单片机不支持仿真时,此法比较实用。
printf指令详见“之10、printf格式化字符串”,具体查看数据方法详见“之1、通过串口查看内部变量”。
图9.5.1 中断的“埋点”
Keil菜单栏点击“View/Call Stack Window”弹出“Call Stack + Locals”对话框。然后在对话框中右键选择“Show Caller Code”,就会跳转到出错之前的函数处,查看这部分函数被调用或者数组内存使用情况等。。
点到Trace”标签下,若选择“SW”,则勾选“Enable”选项,在“Core”框中输入MCU实际工作时钟频率(就是单片机以什么频率来执行指令,MDK会用它来计算时间),再勾选“Autodetect max SW0 Clock”。
图9.6.1
若选择“JTAG”,先勾选“Enable”,在“Core”中设好时钟频率,最后去掉刚才勾选的“Enable”
进入仿真,界面右下角就会有时间窗口:
图9.6.4 查看代码运行时间
鼠标放在上面右键点击,就会有:
图9.6.5
上面两个是复位“t1”和“t2”的,下面3个是选择在状态栏上显示哪个时间。
“t0”表示程序开始运行到现在的时间,不能复位。另外两个可以随便复位,就可以用来测量具体某一个函数或某一行程序的运行时间。
具体方法:在要测试的代码前加一个断点,当程序运行到目标行时会停下,然后复位“t1”或“t2”,并在下一行代码前加断点,然后继续运行程序,程序会停在下一行代码前,这个时候“t1”的值就是目标行程序的运行时间。
图9.6.6
运行两次程序,如图9.6.2晶振处设置0.072MHz,故时间单位mS,1010.27mS。
1)Keil 里面先对串口编程,以下假设你已经设定串口的参数为 9600,n,8,1
2)下载一个虚拟串口软件 vspd,安装后config一下,增加一对串口,比如下图的 COM2<-->COM3
3)Keil 里面给两条指令(调试状态下)
MODE COM2 9600,0,8,1
assign COM2 S1OUT
(如果嫌麻烦,可以先保存为一个 ini文件,并在调试选项里面选中)
图9.7.1
4)然后打开一个串口调试助手,选用另外一个对接的虚拟串口
就可以看到单片机串口输出的内容了。
图9.7.2 输出至电脑
时钟周期也称为震荡周期,定义为时钟脉冲的倒数,是计算机中最基本, 最小的时间单位。
在计算机中,为了便于管理,通常把一条指令执行划分为若干个阶段,每一个阶段完成一项任务。如: 取指令、存储器读,、存储器写等,这每一项工作称为一个基本操作。
完成一个基本操作所需要的时间为机器周期,一个机器周期由若干个S(Status)周期(状态周期)组成,如图10.1所示。
机器周期和时钟周期是传统51留下的一个概念,传统51是把晶振12分频后作为系统时钟使用,因此有一个12倍的关系,后续的很多单片机延续使用此概念,但很多这两个周期都相等了。
执行1条指令所需要的时间, 一般由若干个机器周期组成。指令不同,所需要的机器周期也不同。
对于一些简单的单字节指令, 在取指令周期中, 指令取出到指令寄存器后, 立即译码执行,不再需要其他的机器周期。
对一些比较复杂的指令, 例如:转移指令、 乘法指令,则需要两个或两个以上的机器周期。
通常含一个机器周期的指令称为单周期指令,包含两个机器周期的指令称为双周期指令。
指令周期
(执行1条单字节指令的时间)
8051 1个机器周期=12个时钟周期 12MHz 1uS STC* 12T/6T/1T 12MHz 12T同上 PIC 1个机器周期=4个时钟周期 4MHz 1uS AVR 1个机器周期=4个时钟周期 4MHz 0.25uS MSP430 STM32 平均执行速度1.25MIPS/Mhz 8MHz*9倍=72M 20nS*传统51单片机12个时钟周期执行完一条简单指令(如INC A),称为12T模式,而现在增强型51单片机(比如宏晶STC12C5608)执行这样的指令只需一个晶振周期,即1T模式。可见晶振频率相同的情况下,1T单片机速度是传统51单片机的12倍。
STM32有三级流水线,指令周期不定,ARM给出1.25MIPS/Mhz的1个平均执行速度。1Mhz频率每秒可执行1.25M指令。72M就是72*1.25。而这个最大的应用是通过单周期指令去测试系统时钟是否配置的正确。
下面做一下实际测试:
若软仿真时一直在晶振处出不来,按如下设置。
图10.2
图10.3
图10.4
16.88221mS-16.88219mS = 20nS
花有重开日,人无再少年。觉得不错,动动发财的小手点个赞哦!
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/bcyy/70693.html