keil创建无启动文件及自定义.sct文件的工程

需求背景:在Cortex-M0/M4处理器中实现主程序常驻ROM,子程序动态加载到RAM中运行。

由于Cortex-M0/M4处理器没有MMU,很难像带MMU的处理器那样给程序划分虚拟地址,实际上只能做到主程序与子程序共享同一个地址空间的方式:在主程序预留一段RAM空间A给子程序,子程序编译链接地址就设定为A,虽然同一时刻只能加载一个子程序运行,并不能像Linux或者其他操作系统那样,"同时"运行多个进程,但这也能满足我们的需求。
首先,我们知道用keil创建项目的时候,都可以选择一个对应MCU的启动文件,启动文件里面包含向量表,堆栈设置等关键部分,但是我们的子程序没有这么复杂,实际上他的功能就类似一个函数(堆栈指针共享),主程序通过函数指针的方式调用,子程序完成后,继续返回主程序。这样我们就无须Keil自带的启动文件,我们创建了一个空的工程,然后添加一个.c源文件,并手工添加主函数:
在这里插入图片描述
接下来进行一些设置,因为这个工程没有启动文件,所有常规的main就不是必须的了, 我们可以把函数改成任意其他的名字,避免在编译链接时keil发现存在main后会加入其他不必要的东西,干扰我们的程序。这里我改为init_main,并用__attribute__关键子来赋予init_main函数"RESET"属性,其中"RESET"是链接器识别的属性,在有启动代码的时候,一般是向量表会被赋予该属性,有了这个属性之后,init_main函数的代码就会被放置在代码的最前面。编译器还需要指定一个程序入口,我们这里把init_main设定为程序入口(这一步不是必须的,因为RESET属性已经能把入口函数init_main的代码链接在最前面,但避免编译器由于没有指定程序入口而产生编译警告):
在这里插入图片描述

最后是keil的分散加载文件.sct(其他编译器叫做链接脚本),我们需要根据自己的需求,给程序进行内存布局划分,由于程序没有启动文件,所以链接脚本不能使用keil自动生成的,需要我们自己编辑:在所建工程的Options-Linker-Use Memory Layout from Target Dialog复选框去掉(去掉前先编译一次工程,这样会预先生成一个模板文件):
在这里插入图片描述
之后点击Edit即可编辑.sct文件,根据需要重新定义各个程序段的位置和大小:
在这里插入图片描述
最后我们重新编译一次工程,看看最后的内存布局:
在这里插入图片描述
关键几个点都正确,说明程序基本没有什么问题,由于没有启动文件进行必要的环境设置,这个代码是不能直接下载到MCU去运行的,需要我们再制作一个主程序来加载它到RAM中才能运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值