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中才能运行。
keil创建无启动文件及自定义.sct文件的工程相关推荐
- keil的sct文件_STM32 分散加载文件 .sct 解析
1.STM32 启动文件与 .sct 文件分析 1) 定义STACK段,{NOINIT,读写}:分配一段内存大小为0.5K; 2) 定义HEAP段, {NOINIT,读写}:分配一段内存大小为1K; ...
- 关于keil的进阶操作.烧录、flash回读、sct文件
一.魔术棒options for target 1.进阶操作 一般 c/c++ 标签里会有自定义的宏,选芯片时,也会给出隐藏的宏.具体在"compiler control string&qu ...
- 无进程无DLL无硬盘文件无启动项木马思路(转载)
转自:http://www.cnblogs.com/suiyingjie/ 谢谢了,学习了 现在网络上流行的木马后门类工具很多,但可以称为精品的则没有多少,大多数新手们还在使用Radmin一类的软件来 ...
- vs未指定启动文件_高效开发利器之自定义模板文件
简介 越来越多的设计模式, 最佳实践, 优化了软件开发方式, 提高了软件质量, 但是也带来了大量的类似的文件. 比如说: 现在都使用三层模式来开发Web程序, 都会有服务层(Service), DI的 ...
- 关于KEIL SCT文件重写
最近想在代码中间插入一段配置参数,要占用二个块空间而且会有擦除FLASH.这样要自己手动写SCT文件,本操作基于STM32F429芯片示例. 我想把配置数据放在0X08001000地址占用2K空间,可 ...
- keil的sct文件_(转)KEIL下分散加载文件 **.sct文件
在keil中编译的程序通过了,但是debug的时候会出现一些错误: *** error 65: access violation at 0x4C000018 : no 'write' permissi ...
- Docker系列第04部分:查看容器+创建容器+启动容器+文件挂载+删除容器
1 容器的创建和启动 1.1 虚拟机的生命周期 1.2 容器的生命周期 2.容器操作 2.1 查看容器 查看正在运行容器: docker ps 查看所有的容器(启动过的历史容器) docker ps ...
- keil创建工程没有atmel_如何使用 KEIL 下载 HEX 文件?
熟悉 KEIL 的人都知道,KEIL 下载时使用 axf 格式的文件,里面不仅有代码指令信息,也包含了调试信息,比如C代码和汇编代码之间的对应关系(这些信息不会下载到单片机中,不然单片机可能装不下,哈 ...
- u盘复制文件第二台计算机无文件夹,电脑上的文件不能复制到U盘,U盘不能创建文件夹及删除文件...
电脑上的文件不能复制到U盘,U盘不能创建文件夹及删除文件 计算机基础知识 知识宝库 2013-8-3 6606 0评论 最好查一下电脑被设置的什么保护,该怎样解开 你确认一下, ...
最新文章
- Linux下的Shell编程(2)环境变量和局部变量
- 控件包含代码块,因此无法修改控件集合
- JSP内置对象-application
- 携程python_Python 携程
- LISP 图层前后缀_lisp获取qleader端点_lisp以一个图层来做定义快名称怎么实现
- 谁是ASML的最大股东?为何荷兰光刻巨头要听美国的话?
- 利用Delphi编写Socket通信程序
- 黑客是怎样买彩票的?
- ARC下还会存在内存泄露吗?
- Windows Azure Cloud Service (25) 使用Startup注册COM组件(下)
- CANoe 13 demo 下载和激活
- 合并两个有序数组-python
- 在《寒门状元之死》上,咪蒙贩卖的是什么?
- windows7无法在域中找到计算机账户,关于Windows 7电脑加入域的问题
- python windows开发环境_windows10下搭建Python3.6开发环境
- 系统设计师之路·第二节·看山是山,看水是水——设计师的三种境界
- 51单片机的电子密码锁的设计与仿真
- 花卡宝藏版2020版
- 《计算机学报》征稿简则
- 如何写好一封电子邮件
热门文章
- python米和厘米转换代码_用Python写一个朴素的长度单位转换器
- NVME-MI 学习记录_1 框架
- nagios之nsca被动监控
- trick2-mobilenetv1、mobilenetv2、mobilenetv3替换YOLO主干
- 《算法通识16讲》学习笔记
- Django开发微信公众号
- P2P: Tuning Pre-trained Image Models for Point Cloud Analysis with Point-to-Pixel Prompting
- 2020机修钳工(中级)考试及机修钳工(中级)复审模拟考试
- 如何在sRGB和CIEXYZ之间进行转换
- linux 离线地图开发包,Mapbox本地离线部署