现在手机网站用什么做的好,ui设计网站建设是什么意思,内网门户网站建设,网站规划与建设心得体会MDK和交叉编译工具编译时都会指定程序的下载的地址#xff08;其实就是告诉程序它将在那个地址上开始执行#xff09;#xff0c;这有什么意义吗#xff1f; 其实这么设计有原因的#xff0c;因为这里涉及到全局变量和全局函数指针的地址问题#xff0c;加入当你在编译时…MDK和交叉编译工具编译时都会指定程序的下载的地址其实就是告诉程序它将在那个地址上开始执行这有什么意义吗 其实这么设计有原因的因为这里涉及到全局变量和全局函数指针的地址问题加入当你在编译时指定编译器这段程序会在0x0c000000地址上运行因此全局变量和全局函数指针就会从0x0c000000上开始分配地址此时如果你把这段程序烧录到0x0c000000地址上运行变量的访问和指令存取不会有人任何问题但是如果你将程序下载到0x00000000上运行时在程序会在访问全局变量时实际上这个变量地址分配的地址是0x00000001但是因为你编译是连接地址不是0x00000000所以程序会到0x0c000001去读取这个变量此时就会读到一个错误的值。对于函数指针也是相同的道理但此时指令就跑飞了。 ARM处理器上的用处相对跳转和绝对跳转 绝对跳转就是执行了这一条指令之后就会跳转到绝对跳转的指令中的地址去执行。相对跳转从当前地址偏移一定的偏移地址去执行一个程序。将被编译到0xC0000000地址的代码放到0x00000000地址开始执行如果它们只使用顺序执行或者相对跳转执行方式就可以正常运行未使用全局变量和全局函数指针但如果使用了绝对寻址那么程序就跑飞了。我们参照下面这段伪代码来说明这个情况。 指令编号
指令功能
指令1 顺序执行
指令2 顺序执行
指令3 相对跳转到指令5
指令4 顺序执行
指令5 顺序执行
指令6 绝对跳转到指令8
指令7 顺序执行
指令8 顺序执行 在编译、链接的时候这段程序被告知放在0xC0000000地址空间编译后烧录到0x00000000结果在存储设备中的存放结果为每条指令以4字节计算 指令地址 指令编号 指令功能 下条指令地址0x00000000 指令1 顺序执行 当前地址4
0x00000004 指令2 顺序执行 当前地址4
0x00000008 指令3 相对跳转到指令5 当前地址8
0x0000000C 指令4 顺序执行 当前地址4
0x00000010 指令5 顺序执行 当前地址4
0x00000014 指令6 绝对跳转到指令8 0xC000001C
0x00000018 指令7 顺序执行 当前地址4
0x0000001C 指令8 顺序执行 当前地址4 程序从0x00000000开始运行直到第五条指令都是不会出错的但是当执行完指令6后程序就会跑飞了因为指令6是一条绝对跳转的指令但0xC000001C空间没有代码这样程序就跑飞了。但当这段程序被放在0xC0000000起始空间时开始执行指令1然后采用相对寻址的方法就可以运行到指令6在指令6执行时执行绝对寻址的方法从0xC0000014正确跳转到指令8所在的0xC000001C位置这段代码运行正常。参考博客http://blog.sina.com.cn/s/blog_908da74601011bg6.html 如图 MDK编译后的STM32工程 map文件简单分析 只看map文件中有用的部分 Code为程序代码部分RO-data 表示 程序定义的常量const temp;RW-data 表示 已初始化的全局变量ZI-data 表示 未初始化的全局变量 Program Size: Code18248 RO-data320 RW-data260 ZI-data3952 Code, RO-data,RW-data ............flash RW-data, ZIdata...................RAM 内存 存储Size: RO size: Code RO_data RW size: RW_data ZI_data ROM minimumsize Code RO_data RW_data 即烧/下载程序到FLASH/ROM时所占用的最小空间 Total ROM Size (Code RO Data RW Data)这样所写的程序占用的ROM的字节总数也就是说程序所下载到ROM flash 中的大小。为什么Rom中还要存RW因为掉电后RAM中所有数据都丢失了每次上电RAM中的数据是被重新赋值的每次这些固定的值就是存储在Rom中的为什么不包含ZI段呢是因为ZI数据都是0没必要包含只要程序运行之前将ZI数据所在的区域一律清零即可。包含进去反而浪费存储空间。 RAM size: RW Data ZI Data (即程序运行的时RAM使用的空间) 一个ARM程序包含3部分RO段RW段和ZI段RO是程序中的指令和常量RW是程序中的已初始化变量ZI是程序中的零初始化的变量由以上3点说明可以理解为RO就是readonlyRW就是read/writeZI就是zero 完事今天好冷哎转载于:https://www.cnblogs.com/w-smile/p/10073790.html