《tiny6410裸机程序》第五章:汇编与C混合编程-LED跑马灯最终说明、myled再次精简
来源:互联网 发布:informix数据导入 编辑:程序博客网 时间:2024/06/05 14:31
RVDS的CodeWarrior配置如下:
Linker(链接)设置
RealView Linker->Output:
Linkertype选Simple;Simple image中RO Base填0x50200000、RW Base填0x50203000。
RealView Linker->Options:
Image entry point填0x50200000。
RealView Linker->Layout:
Object/Symbol填Startup.o;Section填start。
其他设置不再说明。
一、汇编代码段完成工作(主要是初始化堆栈)
RO设为0x5020 0138 //RO段,代码段结束地址(起始0x5020 0000)
R1设为0x5020 0478 //ZI段,未初始化全局变量段结束地址
R2设为0x0000 0000 //初始化全局变量
R3设为0x5020 0138 //ZI段,未初始化全局变量段起始地址
1.Startup.s
; 启动文件。初始化C程序的运行环境,然后进入C程序代码。;导入连接器事先定义好的运行域中三个段变量;ARM的可执行映像文件由RO、RW、ZI三个段组成;RO为代码段,RW为已初始化的全局变量,ZI为未初始化的全局变量preserve8IMPORT|Image$$RO$$Limit| ; RO段结束地址IMPORT|Image$$RW$$Base| ; RW段起始地址IMPORT|Image$$ZI$$Base| ; ZI段起始地址 IMPORT|Image$$ZI$$Limit| ; ZI段结束地址IMPORTmain; 声明C程序中的Main()函数AREAStart,CODE,READONLY; 声明代码段StartENTRY; 标识程序入口CODE32; 声明32位ARM指令USR_STACK_LEGTH EQU 128 ; 初始化C程序的运行环境LDRR0,=|Image$$RO$$Limit|LDRR1,=|Image$$RW$$Base|LDRR3,=|Image$$ZI$$Base|CMPR0,R1BEQLOOP1LOOP0CMPR1,R3 LDRCC R2,[R0],#4 STRCC R2,[R1],#4 BCCLOOP0 LOOP1LDRR1,=|Image$$ZI$$Limit| MOVR2,#0LOOP2CMPR3,R1STRCC R2,[R3],#4BCCLOOP2 ;设置系统模式堆栈,SP/r13寄存器;MSR CPSR_c, #0xdfLDR SP, StackUsr BLmain; 跳转到C程序代码Main()函数 StackUsr DCD UsrStackSpace + (USR_STACK_LEGTH - 1)*4 AREA MyStacks, DATA, NOINIT, ALIGN=2UsrStackSpace SPACE USR_STACK_LEGTH * 4 ; 用户(系统)模式堆栈空间 END2.main.c
#define LED1_ON ~(1<<4) //1111 1111 1111 1111 1111 1111 1110 1111 GPKDAT31~GPKDAT0#define LED2_ON ~(1<<5)#define LED3_ON ~(1<<6)#define LED4_ON ~(1<<7)#define LED1_OFF (1<<4) //0000 0000 0000 0000 0000 0000 0001 0000#define LED2_OFF (1<<5)#define LED3_OFF (1<<6)#define LED4_OFF (1<<7)#define LEDALL_OFF (0xf<<4) //0000 0000 0000 0000 0000 0000 1111 0000typedef unsigned longu32;typedef unsigned shortu16;typedef unsigned charu8;#define rGPIOKCON0 (*(volatile u32 *)0x7f008800)#define rGPIOKDAT (*(volatile u32 *)0x7f008808)void delay(int times);int main(void){ u32 uConValue; uConValue = rGPIOKCON0; uConValue &= ~(0xffff<<16); //0000 0000 0000 0000 1111 1111 1111 1111 GPKCON7~GPKCON0 uConValue |= 0x1111<<16; //0001 0001 0001 0001 0000 0000 0000 0000 rGPIOKCON0 = uConValue; rGPIOKDAT |= LEDALL_OFF; while(1){ rGPIOKDAT &= LED1_ON; delay(1000); rGPIOKDAT |= LEDALL_OFF; rGPIOKDAT &= LED2_ON; delay(1000); rGPIOKDAT |= LEDALL_OFF; rGPIOKDAT &= LED3_ON; delay(1000); rGPIOKDAT |= LEDALL_OFF; rGPIOKDAT &= LED4_ON; delay(1000); rGPIOKDAT |= LEDALL_OFF; }}void delay(int times){ int i; for(;times>0;times--) for(i=0;i<3000;i++);}
====================================================================================================================================
3.如果不用RVDS集成编译环境,以下是基于Window平台下armcc编译器在DOS中执行的Makefile
all:armasm -o Startup.o Startup.s --debug --keep --cpu=ARM1176JZF-Sarmcc -c main.o main.c --debug --cpu=ARM1176JZF-S -O0armlink -o myled.axf Startup.o main.o --ro_base=0x50200000 --rw_base=0x50203000 --first=Startup.o(start) --entry=0x50200000fromelf -o myled.bin --bin myled.axfclean:del *.o *.axf *.bin#armasm -o Startup.o Startup.s --debug --keep --cpu=ARM1176JZF-S#armcc -c main.o main.c --debug --cpu=ARM1176JZF-S -O0#armlink -o inclc.axf Startup.o main.o --entry Main --ro_base=0x50200000 --first=Startup.o(start) #fromelf -o inclc.bin --bin inclc.axf
4.以上完了之后直接调出AXD即可。
- 《tiny6410裸机程序》第五章:汇编与C混合编程-LED跑马灯最终说明、myled再次精简
- 《tiny6410裸机程序》第二章:LED跑马灯RVDS精简main.c说明
- 《tiny6410裸机程序》第四章:汇编与C混合编程
- 《tiny6410裸机程序》第一章:LED跑马灯RVDS调试初探
- tiny6410裸机实验第1章--------------ARM汇编和编程基础(C与ARM汇编混合编程)
- tiny6410裸机程序之一、led流水灯
- 《tiny6410裸机程序》第六章:myled通过usb下载至nandflash不能运行
- 《tiny6410裸机程序》第六章:myled通过usb下载至nandflash不能运行
- tiny6410 LED跑马灯
- ARM裸机程序开发7(汇编与c混合编程)
- [2014.3.17]mini2440裸机跑马灯/按键点亮LED的C程序
- tiny6410的led裸机程序源代码
- tiny6410裸机实验第2章--------------点亮LED灯(用C来写)
- 《tiny6410裸机程序》第三章:基础汇编test1
- [笔记]:Tiny6410裸机点亮led灯
- C与汇编混合编程
- C与汇编混合编程
- C与汇编混合编程
- Jsp学习之 自定义标签
- 现代浏览器的工作原理
- 那些年,我们一起喜欢的诺基亚
- Android.mk高级写法
- 继承修饰符public、private、protected
- 《tiny6410裸机程序》第五章:汇编与C混合编程-LED跑马灯最终说明、myled再次精简
- 杭电ACM 2015 偶数求和
- Virtual process memory
- Android Dimension 尺寸
- 在迷茫中死去,闭关!从此不再CSDN发表博客,封号!
- linux下用脚本改变文件某一行的内容
- c 语言输入
- ubuntu+apache2+php5+mysql5.5的安装
- cocos2d-x总结(五)CCSprite精灵的加载与常用操作