需求背景:在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文件的工程相关推荐

  1. keil的sct文件_STM32 分散加载文件 .sct 解析

    1.STM32 启动文件与 .sct 文件分析 1) 定义STACK段,{NOINIT,读写}:分配一段内存大小为0.5K; 2) 定义HEAP段, {NOINIT,读写}:分配一段内存大小为1K; ...

  2. 关于keil的进阶操作.烧录、flash回读、sct文件

    一.魔术棒options for target 1.进阶操作 一般 c/c++ 标签里会有自定义的宏,选芯片时,也会给出隐藏的宏.具体在"compiler control string&qu ...

  3. 无进程无DLL无硬盘文件无启动项木马思路(转载)

    转自:http://www.cnblogs.com/suiyingjie/ 谢谢了,学习了 现在网络上流行的木马后门类工具很多,但可以称为精品的则没有多少,大多数新手们还在使用Radmin一类的软件来 ...

  4. vs未指定启动文件_高效开发利器之自定义模板文件

    简介 越来越多的设计模式, 最佳实践, 优化了软件开发方式, 提高了软件质量, 但是也带来了大量的类似的文件. 比如说: 现在都使用三层模式来开发Web程序, 都会有服务层(Service), DI的 ...

  5. 关于KEIL SCT文件重写

    最近想在代码中间插入一段配置参数,要占用二个块空间而且会有擦除FLASH.这样要自己手动写SCT文件,本操作基于STM32F429芯片示例. 我想把配置数据放在0X08001000地址占用2K空间,可 ...

  6. keil的sct文件_(转)KEIL下分散加载文件 **.sct文件

    在keil中编译的程序通过了,但是debug的时候会出现一些错误: *** error 65: access violation at 0x4C000018 : no 'write' permissi ...

  7. Docker系列第04部分:查看容器+创建容器+启动容器+文件挂载+删除容器

    1 容器的创建和启动 1.1 虚拟机的生命周期 1.2 容器的生命周期 2.容器操作 2.1 查看容器 查看正在运行容器: docker ps 查看所有的容器(启动过的历史容器) docker ps ...

  8. keil创建工程没有atmel_如何使用 KEIL 下载 HEX 文件?

    熟悉 KEIL 的人都知道,KEIL 下载时使用 axf 格式的文件,里面不仅有代码指令信息,也包含了调试信息,比如C代码和汇编代码之间的对应关系(这些信息不会下载到单片机中,不然单片机可能装不下,哈 ...

  9. u盘复制文件第二台计算机无文件夹,电脑上的文件不能复制到U盘,U盘不能创建文件夹及删除文件...

    电脑上的文件不能复制到U盘,U盘不能创建文件夹及删除文件 计算机基础知识    知识宝库    2013-8-3    6606    0评论 最好查一下电脑被设置的什么保护,该怎样解开 你确认一下, ...

最新文章

  1. Linux下的Shell编程(2)环境变量和局部变量
  2. 控件包含代码块,因此无法修改控件集合
  3. JSP内置对象-application
  4. 携程python_Python 携程
  5. LISP 图层前后缀_lisp获取qleader端点_lisp以一个图层来做定义快名称怎么实现
  6. 谁是ASML的最大股东?为何荷兰光刻巨头要听美国的话?
  7. 利用Delphi编写Socket通信程序
  8. 黑客是怎样买彩票的?
  9. ARC下还会存在内存泄露吗?
  10. Windows Azure Cloud Service (25) 使用Startup注册COM组件(下)
  11. CANoe 13 demo 下载和激活
  12. 合并两个有序数组-python
  13. 在《寒门状元之死》上,咪蒙贩卖的是什么?
  14. windows7无法在域中找到计算机账户,关于Windows 7电脑加入域的问题
  15. python windows开发环境_windows10下搭建Python3.6开发环境
  16. 系统设计师之路·第二节·看山是山,看水是水——设计师的三种境界
  17. 51单片机的电子密码锁的设计与仿真
  18. 花卡宝藏版2020版
  19. 《计算机学报》征稿简则
  20. 如何写好一封电子邮件

热门文章

  1. python米和厘米转换代码_用Python写一个朴素的长度单位转换器
  2. NVME-MI 学习记录_1 框架
  3. nagios之nsca被动监控
  4. trick2-mobilenetv1、mobilenetv2、mobilenetv3替换YOLO主干
  5. 《算法通识16讲》学习笔记
  6. Django开发微信公众号
  7. P2P: Tuning Pre-trained Image Models for Point Cloud Analysis with Point-to-Pixel Prompting
  8. 2020机修钳工(中级)考试及机修钳工(中级)复审模拟考试
  9. 如何在sRGB和CIEXYZ之间进行转换
  10. linux 离线地图开发包,Mapbox本地离线部署