/****************************************************************************
*
* ASM with C,MMU,Exception,GIC
*
* 声明:
* 1. 本系列文档是在vim下编辑,请尽量是用vim来阅读,在其它编辑器下可能会
* 不对齐,从而影响阅读.
* 2. 以下所有的shell命令都是在root权限下运行的;
* 3. 文中在需要往文件中写入内容的时候使用了如下2方式:
* 1.如果文件不存在,创建文件;如果存在,以覆盖的方式往文件中添加内容:
* cat > 文件名 << EOF (结束符)
* ...
* 文件内容...
* ...
* EOF (输入遇到EOF,cat指令结束,内容将保存在前面指定的文件中)
* 2.如果文件不存在,创建文件;如果存在,将内容追加到文件尾:
* cat >> 文件名 << EOF (结束符)
* ...
* 文件内容...
* ...
* EOF
*
****************************************************************************/
\\\\\\\--*目录*--//////////////
| 一. 预热文章;
| 二. C语言中插入ARM汇编;
| 三. U-Boot下汇编裸板开发基本流程;
| 四. U-Boot下C语言裸板开发基本流程;
| 五. MMU 配置流程;
| 六. Exception 配置及处理;
| 七. 主程序对异常的处理;
\\\\\\\\\\///////////////////
一. 预热文章:
1. Make 命令教程
url: http://www.ruanyifeng.com/blog/2015/02/make.html
2. ATPCS和内嵌汇编: arm处理器上函数调用寄存器的使用规则
url: http://bog.csdn.net/yypony/article/details/17633323
二. C语言中插入ARM汇编:
1. cat > test.c << EOF
#include int main(void) { volatile unsigned int a ; int b ; __asm__ __volatile__ ( 'mov r0, #11 n' // 如果立即数小于256直接附值 'mov %0, r0 n' 'mov %1, #125 n' :'=r'(a),'=r'(b) // 输出 : // 输入 :'r0' // 已经使用过的寄存器 ); printf('a:%d b:%d n' , a , b); return 0 ; } EOF 2. arm-linux-gcc test.c -o test 3. minicom(U-Boot)中运行编译好的test程序: ./test 三. U-Boot下汇编裸板开发基本流程: 1. 编译好U-Boot后,在其根目标录下会生成一个System.map文件,这是U-Boot中提供的 函数及其地址(符号表),我们可以把U-Boot当作一个函数库来使用. 2. cat > test.S << EOF .global _start _start: stmfd sp! , {r0-r12 , lr} @寄存器入栈 @ 0x43e11434是U-Boot中printf地址,这个地址不是固定,这是我编译的U-Boot中 @ printf的地址, 因为如果修改了U-Boot的源码,printf地址会变,U-Boot其他 @ 函数地址也会变,所以大家以各自编译U-Boot后产生的System.map文件中的 @ 地址为准. ldr r1 , =0x43e11434 ldr r0 , =str mov lr , pc mov pc , r1 ldmfd sp! , {r0-r12 , pc} @寄存器出栈 str: .string 'hello worldn' .align 5 EOF 3. cat > Makefile << EOF all: arm-linux-gcc -c test.S -o test.o arm-linux-ld -Ttext=0x40008000 test.o -o test # 0x40008000是加载代码的起始地址 arm-linux-objcopy -O binary test test.bin # 获取二进制可运行文件 clean: rm -rf test.o test test.bin EOF 4. make 5. 将test.bin烧入开发板,运行程序,得到结果. 6. 如果不使用默认的连接文件,采用自己编写的连接文件,操作如下: 1. 获取链接脚本模板: arm-linux-ld --verbose > test.lds ,修改模板文件为如下文件内容: ============================================================================= /* Script for -z combreloc: combine and sort reloc sections */ OUTPUT_FORMAT('elf32-littlearm', 'elf32-bigarm', 'elf32-littlearm') OUTPUT_ARCH(arm) ENTRY(_start) SEARCH_DIR('=/usr/local/lib'); SEARCH_DIR('=/lib'); SEARCH_DIR('=/usr/lib'); SECTIONS { . = 0x40008000 ; /* 运行代码的起始地址 */ .text : { test.o(.text) ; /* _start标号在这个文件里 */ *(.text) ; } align = 4 ; } 2. 修改Makefile如下: cat > Makefile << EOF all: arm-linux-gcc -c test.S -o test.o arm-linux-ld -T test.lds *.o -o test arm-linux-objcopy -O binary test test.bin clean: rm -rf test.o test test.bin EOF 四. U-Boot下C语言裸板开发基本流程: 1. 编译好U-Boot后,在其根目标录下会生成一个System.map文件,这是U-Boot中提供的 函数及其地址(符号表),我们可以把U-Boot当作一个函数库来使用. 2. cat > test.c << EOF int num = 1; int array[10] = {0}; //0x43e11434是U-Boot中printf地址,这个地址不是固定,如果修改了源码,地址可能会变 int (*printf)(const char *fmt , ...) = (void *)0x43e11434; int _start(void) // 这里不能是main,因为裸板运行的其实函数是_start,和汇编一样 { printf('num:%d n' , num); int i ; for(i = 0 ; i < 10; i++) { printf('array[%d]: %d n' , i , array[i]); } return 0 ; } EOF 3. cat > Makefile << EOF all: arm-linux-gcc -c test.c -o test.o -fno-builtin arm-linux-ld -T test.lds *.o -o test #采用第三部分的lds文件 arm-linux-objcopy -O binary test test.bin clean: rm -rf test test.bin *.o EOF 4. make 5. 将test.bin烧入开发板,运行程序,得到结果. 五. MMU 配置流程: void memset(int *ttb , char ch , int size ) {
上一篇:ARM_Instruction_Set_Encoding_hacking(ARM指令集编码格式解读)
下一篇:tiny4412 UART for C printf Demo
推荐阅读最新更新时间:2026-03-25 11:30
- 用于 7VIN 至 16VIN、1.5V 和 1.2V 输出的 LTM4628EV DC/DC 模块稳压器的典型应用电路
- 使用 Analog Devices 的 LTC3728LIGN 的参考设计
- DER-406 - 适用于 A19 灯的 5.76 W 高 PF 非隔离降压-升压型 TRIAC 调光 LED 驱动器
- ADR5045B 5V 输出精密微功率并联模式电压基准的典型应用
- LT3970EDDB-3.42 2.5V 降压转换器的典型应用
- MC78M08BDTG 8V 电流调节器的典型应用
- LT1021DCN8-5 精密电压基准的典型应用
- DER-282 - 100W, 扁平(11 mm), LLC DC-DC转换器
- REF193 低压差开尔文连接电压基准的典型应用电路
- LT3088EM 线性稳压器用于添加软启动的典型应用



I2C定义文件
GD32F30X_Firmware_Libarary
直接生成在屏幕上设计多层菜单Tubro C, Borland C,MSC源程序,
现代雷达系统的信号设计
IDT71421SA35JI






京公网安备 11010802033920号