C语言程序的执行需要栈的支持。部分soc未初始化栈的情况下调用C语言程序会发生错误。

  start.S中一共配置了看门狗,svc栈,icache。

  在x210中看门狗默认关闭,svc栈默认开启,icahe默认开启。

  因为系统在复位后默认是进入SVC模式的,所以我们去配置SVC模式的sp就可以,(在ARM中,ATPCS(ARM关于程序应该怎么实现的一个规范)要求使用满减栈,所以不出意外都是用满减栈)通过X210数据手册结合iROM_application_note中的memory map,可知SVC栈应该设置为0xd0037D80。(x210中在内存中默认设置了一段地方作为栈地址)

  icahe为高速缓冲区  

  cache是一种内存,叫高速缓存。
  从容量来说:CPU < 寄存器 < cache < DDR
  从速度来说:CPU > 寄存器 > cache > DDR

  cache工作时,会把我们CPU正在运行的指令的旁边几句指令事先给读取到icache中(CPU设计有一个基本原理:代码执行时,下一句执行当前一句代码旁边代码的可能性要大很多)。当下一句CPU要指令时,cache首先检查自己事先准备的缓存指令中有没这句,如果有就直接拿给CPU,如果没有则需要从DDR中重新去读取拿给CPU,并同时做一系列的动作:清缓存、重新缓存。

  icache在X210默认是开启的,由协处理器进行设置。

  mrc p15,0,r0,c1,c0,0; // 读出cp15的c1到r0中
  bic r0, r0, #(1<<12) // bit12 置0 关icache
  orr r0, r0, #(1<<12) // bit12 置1 开icache
  mcr p15,0,r0,c1,c0,0;

  

start.S

#define WTCON        0xE2700000
#define SVC_STACK 0xd0037d80
.global _start // 把_start链接属性改为外部,这样其他文件就可以看见_start了
_start:
// 第1步:关看门狗(向WTCON的bit5写入0即可)(默认关闭)
ldr r0, =WTCON
ldr r1, =0x0
str r1, [r0]
//第二步:设置SVC栈(默认开启)
ldr sp,=SVC_STACK //可以调用C语言了 //开关icache mrc p15,,r0,c1,c0,; // 读出cp15的c1到r0中(默认开启) //bic r0, r0, #(<<) // bit12 置0 关icache
orr r0, r0, #(<<) // bit12 置1 开icache mcr p15,,r0,c1,c0,; // 读出cp15的c1到r0中 bl led_blink//调用C函数 b .

led.c

C语言访问寄存器是通过指针访问。

led.c

#define GPJ0CON        0xE0200240
#define GPJ0DAT 0xE0200244
#define rGPJ0CON *((volatile unsigned int*)GPJ0CON)
#define rGPJ0DAT *((volatile unsigned int*)GPJ0DAT)
void delay(void);
void led_blink(void)
{
rGPJ0CON=0x11111111;
while()
{
rGPJ0DAT =~(<<);
delay();
rGPJ0DAT =~(<<);
delay();
rGPJ0DAT =~(<<);
delay();
} }
void delay(void)
{
volatile unsigned int i=;//volatile 避免编译器优化
while(i--);
}

Makefile

led.bin: start.o led.o
arm-linux-ld -Ttext 0x0 -o led.elf $^ (将.o文件进行链接生成可执行程序,链接地址为0x0)
arm-linux-objcopy -O binary led.elf led.bin (将可执行程序制作成镜像文件.bin)
arm-linux-objdump -D led.elf > led_elf.dis (将可执行程序进行反汇编)
gcc mkv210_image.c -o mkx210 (后两句是为了处理SD卡烧录文件制作)
./mkx210 led.bin 210.bin %.o : %.S(将.S文件编译成.O)
arm-linux-gcc -o $@ $< -c -nostdlib (nostdlib就是不使用标准函数库。标准函数库就是编译器中自带的函数库,用-nostdlib可以让编译器链接器优先选择我程序内自己写的函数库。) %.o : %.c(将.c文件编译成.O)
arm-linux-gcc -o $@ $< -c -nostdlib 
clean:
rm *.o *.elf *.bin *.dis mkx210 -f

Makefile

led.bin: start.o led.o
arm-linux-ld -Ttext 0x0 -o led.elf $^
arm-linux-objcopy -O binary led.elf led.bin
arm-linux-objdump -D led.elf > led_elf.dis
gcc mkv210_image.c -o mkx210
./mkx210 led.bin .bin %.o : %.S
arm-linux-gcc -o $@ $< -c -nostdlib %.o : %.c
arm-linux-gcc -o $@ $< -c -nostdlib clean:
rm *.o *.elf *.bin *.dis mkx210 -f

裸机配置C语言运行环境的更多相关文章

  1. jupyter notebook 中同时添加Python2和3,在conda下配置R语言运行的环境

    1.第一步,安装Python2的环境 首先,在安装anaconda的时候先选择一个Python安装,我先安装的是Python3 然后,在anaconda Prompt下创建Python2环境 现在,还 ...

  2. 配置perl-cgi的运行环境,由于Active Perl安装在d:\perl

    Apache 1.3.22 for Win32+PHP 4.0.6+Active Perl 5.006001+Zend Optimizer v1.1.0+mod_gzip 1.3.19.1a+MySQ ...

  3. Eclipse平台下配置Go语言开发环境(Win7)

    <Go语言编程>中写到:“从功能和易用性等方面考虑, Eclipse+GoEclipse.LiteIDE这两个环境在所有IDE里面是表现最好的”,所以笔者打算采用Eclipse+GoEcl ...

  4. vsCode怎么为一个前端项目配置ts的运行环境

    vsCode为一个前端项目配置ts的运行环境,ts文件保存的时候自动编译成js文件: 假设此前端项目名称为Web:文件结构如图 1. 在根目录中新建一个“.vscode”文件夹,里面建一个“tasks ...

  5. VS、C#配置R语言开发环境

    R语言学习笔记(一)——在Vs.C#中配置R语言开发环境. 最近在学习小众的R语言,所以将遇到的问题记录下来供大家参考,不足之处欢迎大家交流指正. 至于R语言的介绍就不多说了,它集成了复杂的数学算法, ...

  6. VS Code配置Go语言开发环境

    VS Code是微软开源的一款编辑器,插件系统十分的丰富.本文就介绍了如何使用VS Code搭建Go语言开发环境. VS Code配置Go语言开发环境 说在前面的话,Go语言是采用UTF8编码的,理论 ...

  7. VS Code配置Go语言开发环境(建议使用goland)

    VS Code是微软开源的一款编辑器,插件系统十分的丰富.本文就介绍了如何使用VS Code搭建Go语言开发环境. VS Code配置Go语言开发环境 说在前面的话,Go语言是采用UTF8编码的,理论 ...

  8. VScode配置CMD本地运行环境(2.0)

    VScode配置CMD本地运行环境(2.0) 官方Task.json说明 完整的Task.json配置信息 Task.json预定义变量 看了很多网上的教程都说需要下载VScode的python插件, ...

  9. GO学习-(3) VS Code配置Go语言开发环境

    VS Code配置Go语言开发环境 VS Code配置Go语言开发环境 说在前面的话,Go语言是采用UTF8编码的,理论上使用任何文本编辑器都能做Go语言开发.大家可以根据自己的喜好自行选择.编辑器/ ...

随机推荐

  1. Centos7下安装mysql服务

    yum install -y perl-Module-Install.noarch yum -y install perl perl-devel #命令下载mysql wget http://dev. ...

  2. HADOOP docker(九):hdfs权限

    1. 概述2. 用户身份标识3. 组映射4.关于权限的实现5.文件系统API的变更6.应用程序shell的变更7.超级用户8.ACLs9.ACL 文件系统API10.ACL命令11.参数配置12.总结 ...

  3. HDU 4300 Clairewd’s message (next函数的应用)

    题意:给你一个明文对密文的字母表,在给你一段截获信息,截获信息前半段是密文,后半段是明文,但不清楚它们的分界点在哪里,密文一定是完整的,明文可能是残缺的,求完整的信息串(即完整的密文+明文串). 题解 ...

  4. Alpha发布文案+美工

    文案: Alpha发布文稿 我们是Hello World!团队,下面由我来简要介绍一下我们组的作品,我们组做的是一个飞机射击类游戏,名字叫做空天猎.这个游戏是基于JAVA平台创建的,那么接下来让我给大 ...

  5. android平台蓝牙编程(转)

    http://blog.csdn.net/pwei007/article/details/6015907 Android平台支持蓝牙网络协议栈,实现蓝牙设备之间数据的无线传输. 本文档描述了怎样利用a ...

  6. 模拟Excel同一列相同值的单元格合并

    背景 项目中有一个查询工作量,可以将查询的结果导出到Excel表中.在Excel工具中,有一个合并居中功能,可以将选中的单元格合并成一个大的单元格.现在需要在程序中直接实现查询结果的汇总, 问题分析 ...

  7. LintCode-73.前序遍历和中序遍历树构造二叉树

    前序遍历和中序遍历树构造二叉树 根据前序遍历和中序遍历树构造二叉树. 注意事项 你可以假设树中不存在相同数值的节点 样例 给出中序遍历:[1,2,3]和前序遍历:[2,1,3]. 返回如下的树:    ...

  8. MFC最基本动作(如创建窗口,点击取消等)函数的执行顺序

    一.MFC应用程序中处理消息的顺序: 1.AfxWndProc()       该函数负责接收消息,找到消息所属的CWnd对象,然后调用AfxCallWndProc2.AfxCallWndProc() ...

  9. iOS 出现错误reason: image not found的解决方案

    在制作framework时遇到真机运行时导致的reason: image not found允许崩溃的问题,下面是我的解决方案: 首先我们分析一下出现这种情况的原因,原因就是framework找不到镜 ...

  10. angular4中使用jquer插件

    有以下办法 1 在html文档头部引入jquery插件依赖,但是文档一旦变动就麻烦了 2 使用指令:http://www.cnblogs.com/liuyt/p/5810100.html 指令是把利器 ...