首页
|
新闻
|
新品
|
文库
|
方案
|
视频
|
下载
|
商城
|
开发板
|
数据中心
|
座谈新版
|
培训
|
工具
|
博客
|
论坛
|
百科
|
GEC
|
活动
|
主题月
|
电子展
注册
登录
论坛
博客
搜索
帮助
导航
默认风格
uchome
discuz6
GreenM
»
MCU 单片机技术
» 软件Overlay:程序编写与调试(1)
返回列表
回复
发帖
发新话题
发布投票
发布悬赏
发布辩论
发布活动
发布视频
发布商品
软件Overlay:程序编写与调试(1)
发短消息
加为好友
我是MT
当前离线
UID
1023166
帖子
6651
精华
0
积分
3328
阅读权限
90
来自
燕山大学
在线时间
230 小时
注册时间
2013-12-19
最后登录
2016-1-5
论坛元老
UID
1023166
性别
男
来自
燕山大学
1
#
打印
字体大小:
t
T
我是MT
发表于 2015-11-3 15:22
|
只看该作者
软件Overlay:程序编写与调试(1)
程序编写
,
展示柜
,
软件
,
黄金
,
小店
近几年来,SOC为了支持更大的硬件资源,及更精确的算法,很多应用中的软件程序代码越来越大,但是售价却要越来越便宜。各家厂商无不绞尽脑汁寻找降低成本的方法。
SRAM在SOC上,是一个快速但单位面积较大的组件,而单位面积较大代表成本较高。有一个降低成本的方法,是将程序代码放在较慢但单位面积较小的flash或ROM上,当系统需要执行里面的某些程序代码时,才加载到内存里执行。
如果用商店来比喻的话,有一个小店租在都市里的黄金店面里,小店的展示柜很小,当客人想要看架上没有的商品时,店员才从后面较大的仓库里,把商品拿出来放到展示柜上。这里的展示柜就像SRAM,昂贵但是有效率,仓库就像flash,便宜容积大但是存取较麻烦。
本文介绍的是软件overlay的技术。除此之外,晶心科技也发展了硬件overlay的技术,使得overlay执行更快,操作更为简单。期望本文章能对使用者有所帮助,也希望读者不吝指教提供您宝贵的意见。
1. 软件Overlay技术介绍及操作
我们举一个实际例子作为说明,比方说程序代码的大小为210KB,RAM只有64KB,我们把RAM规划成一格一格的大小,比方说每4KB切成一块。每 4KB的大小可以在不同时间,更换成不同的程序代码,可以重复利用RAM的空间。程序代码储存在ROM或flash里,只有在执行之前会将函数从ROM或 flash里动态加载SRAM里。当这个函数执行完成,下一个函数要执行前,再加载下一个函数。
值得注意的是,每一格SRAM里可加载的程序代码是互斥的,比方说有些不会同时使用的功能可以放在同一格里,比方说mp3播放器,录音和播放不会同时使用,就可以规划重复利用同一格SRAM。
1.1 系统架构
请参考图表1,右边长方形是flash的内容。0x0起1MB的空间,flash里存放了程序代码和.data,及各个即将要被overlay的sections。
图表1的左边长方形是SRAM规划,地址从0x10000000开始,我们切出三格提供overlay的SRAM,分别是0x10800000, 0x10804000及0x10808000。Overlay要规划成几格,或者每一格要切成多大块,都是由使用者规划。这里的SRAM与flash的地址是以通用型Andes FPGA开发板作例子。读者设计SOC时,可以根据实际需求定义合理的地址。
程序执行时,0x10800000可以加载.ovly0或是.ovly1。0x10804000可以加载.ovly3或是.ovly2。0x10808000可以加载.ovly4或是.ovly5。
1.2 overlay的sag文件编写
图表2是范例sag文件。Sag文件是Andes linker script generator所需要的输入文件,执行linker script generator后,输出会产生GNU linker需要的linker script。详细语法说明可以参考Andes BSP v3.2.0 User manual第12章。
我们简单介绍图表2的语法。第1行关键词USER_SECTIONS表示后面接的这几个sections都是由使用者自定义的sections。在后面的章节,笔者会介绍如何把函数指定为这些自定义sections。
1.3 sag文件转成linker script
如图表3,在cygwin下执行nds_ldsag软件,将sw-ovly.sag转成sw-nds32.ld文件。参数-o sw-nds32.ld为指定输出文件名。nds_ldsag软件可以在AndeSight 2.0.1 MCU或是BSP v3.2.0里取得。
1.4 程序里指定函数或变量放在自定义的sections
GNU ld (linker)可连结目标文件为可执行文件,排列上的最小单位是section,基本的sections为.text,.data及.bss这3个 sections。为了达成分区overlay的功能,必须指定函数或是变量在自定义的sections上。在前一节里我们介绍了我们切出3个区域可以做 overlay,分别是OVLY0(从0x10800000起),OVLY1(从0x10804000起)及OVLY2(从0x10808000起)三个区域。指定函数overlay0放在自定义section .overlay0里,要使用__attribute__((section(".overlay0")))语法,完整写法请参考图表4a。图表4b.是另外一种写法。
1.5 各sections的LMA与VMA
图表6,是各个section的LMA和VMA。在这个表上,可以看.andes32_init到.sdata_w的LMA从0x0~0x29dc,这些 section的LMA是连续的。.overlay0与.overlay1做overlay,所以有共同的VMA 0x10800000。同样的,.overlay2和.overlay3,具有共同的VMA 0x10804000。.Overlay4和.overlay5,也有同样的VMA 0x18008000。
1.6 overlay程序的加载
前面已经介绍overlay section的sag文件写法。那么如何加载用户想要用的overlay程序呢?
请看图表7,这是overlay的执行程序代码。第5行OverlayLoad(0)表示载入section .overlay0。第6行OverlayLoad(4)表示载入section .overlay4。第7行在.overlay0被加载后,执行overlay0(),可以正常工作。
再来我们介绍一下Overlay manager的程序运作,Overlay manager即为图表7中的函数OverlayLoad。图表8列出Overlay manager代码段,主要做了两件事。一,修改mapped table _ovly_table,标示overlay section是mapped或是unmapped。_ovly_table的用途是让gdb知道目前加载的是哪一个section,使得gdb在 debug时,能自动切换为正确的调试信息。
收藏
分享
评分
回复
引用
订阅
TOP
返回列表
电商论坛
Pine A64
资料下载
方案分享
FAQ
行业应用
消费电子
便携式设备
医疗电子
汽车电子
工业控制
热门技术
智能可穿戴
3D打印
智能家居
综合设计
示波器技术
存储器
电子制造
计算机和外设
软件开发
分立器件
传感器技术
无源元件
资料共享
PCB综合技术
综合技术交流
EDA
MCU 单片机技术
ST MCU
Freescale MCU
NXP MCU
新唐 MCU
MIPS
X86
ARM
PowerPC
DSP技术
嵌入式技术
FPGA/CPLD可编程逻辑
模拟电路
数字电路
富士通半导体FRAM 铁电存储器“免费样片”使用心得
电源与功率管理
LED技术
测试测量
通信技术
3G
无线技术
微波在线
综合交流区
职场驿站
活动专区
在线座谈交流区
紧缺人才培训课程交流区
意见和建议