记ubuntu的uClinux交叉编译环境的搭建以及操作系统的引导
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
终于让我找到了最好的解决方法,就是用 vi 修改这个文件的文件头。
我是把 arm-elf-tools-20030314.sh 放在 root 里面的,所以命令如下
sudo su
cd ~/
vi arm-elf-tools-20030314.sh
将这个文件的第 38 行改成这个样子
然后重启系统之后,就可以用 root 登录终端./arm-elf-tools-20030314.sh 命令安装了(具 体 vi 命令请参见网络上的说明)
保存,退出
一步步执行,直到在“Main Menu“中选上我们的“Test Program“
这样我们就设置结束了,保存退出,分别执行"make dep"、"make clean"、"make lib_only"、 "make user_only"、"make_romfs"、"make image"生成我们的 rom 文件,值得注意的是有时 在"make image"时会出错,这个时候需要用"make linux"命令重新编译 linux 内核即可。
#define ULCON0 (* (volatile unsigned *) 0x03ffd000) \\定义 UART0 线控制寄存器地址
#define UCON0 (* (volatile unsigned *) 0x03ffd004) \\定义 UART0 控制寄存器地址
#define USTAT0 (* (volatile unsigned *) 0x03ffd008) \\定义 UART0 状态寄存器
**要注意到 all、romfs、clean 等后面是具体 GCC 命令,必须换行后 Tab 一下才能识别,这 是语法问题! 下一步建立 user 文件夹下的 Makefile
添加如标注的两行,这样就能告诉编译器我们需要编译的东东
下面我们需要让“make menuconfig”能够显示出我们的程序来就还需要设置 "~/Uclinux-dist/config"目录下的“config.in”文件
第一个程序------跑马灯
#define IOPMOD (*(volatile unsigned *) 0x03ff5000) \\定义 IO 工作方式寄存器端口地 址 #define IOPDATA (*(volatile unsigned *) 0x03ff5008) \\定义 IO 数据寄存器地址
添加如图所示的代码。
最后,需要这两个程序自动启动的话还需要修改 “~/uClinux-dist/Vendors/Samsung/4510B/"下的 rc 文件,向其最后添加 “./bin/led& ./bin/uart&" 两行代码。 完成这些以后,我们就可以开始编译了
在“Target Platform Selection"中选择“Customize Kernel Settings (NEW)“和”Customize Vendor/User Settings (NEW)“
这个很坑爹的工具安装好了以后,就可以解压 uClinux-dist.tar.gz,解压在主文件夹是个 不错的选择,root 里面要向外复制的话文件权限 不好解决。
解压好了 uClinux-dist.tar.gz 之后,就可以先在目录下 make menuconfig 看一看内核设置 之类的东东了
当然,现在只是一个开始,还是得添加自己的一些程序到系统里,所以先退出,编写下要用 到的东西
这次我选择了用 Ubuntu 这个版本的 linux 作为我的开发环境,是因为它的界面还算友好, 对于我这种 linux 白痴一样的人能少用一点命令那是再好不过了的。可是我没有想到 Ubuntu 可以这样的坑爹,由于用的 shell 和别个的 linux 不同,所以直接导致 arm-elf-tools-20030314.sh 不能打开,所以更别说安装了。Google 了很久,终于不得不去 面对了一个现实,就是我偷懒不想用命令,结果我得用更多的命令去安装这个该死的工具。
void Delay(unsigned int x) { unsigned int i,j,k;
for(i=0;i<=x;i++) for(j=0;j<0xff;j++) for(k=0;k<0xff;k++); } 将这两个文件放到“~/uClinux-dist/user”下新建的文件夹“new_ap”中,接下来就是为 这两个文件建立 Makefile
SYSCFG EQU 0x3FF0000 ;定义系统设置寄存器地址 EXTDBWTH EQU 0x3FF3010 ;总线宽度寄存器地址
ROMCON0 EQU 0x3FF3014 ;ROM 配置寄存器地址 SDRAMCON0 EQU 0x3FF303C ;SDRAM 配置寄存器地址 REFEXTCON EQU 0x3FF303C ;刷新与外部寄存器地址
记 ubuntu 的 uClinux 交叉编译环境的搭建以及操作系统的引导
1、uClinux 交叉编译环境的搭建
从 www.uclinux.org 下载好的文件有 arm-elf-tools-20030314.sh 和 uClinux-dist.tar.gz, 其中前者是编译工具,后者是 uClinux 的内核源码,我们就是利用这个工具编译裁剪好了的 系统。
Delay(10); while(1) { Delay(10); PrintUART(0,"Hello World!"); \\输出“Hello World!” } return 0; }
void PrintUART(int port,char *s) \\串口输出函数体 { if(port==0) \\若是串口 0 for(;*s!='\0';s++) \\输出字符串*s,遇到换行符停止 { for(;(!(USTAT0&0x40));); \\状态寄存器第七位为 1 时停止输出,因为代表结束帧 UTXBUF0=*s; \\发送缓存寄存器置字符 } if(port==1) \\若是串口 1 for(;*s!='\0';s++) { for(;(!(USTAT0&0x40));); UTXBUF1=*s; } }
void Delay(int i) \\延时函数 { int j,k; for(j=0;j<i;j++) { k=0; } }
int main(void) {
\\主函数--------跑马灯
IOPMOD=0xffffffff;
\\设置 IO 工作方式为输出
while(1)
{
IOPDATA=0x01; \\设置 IO 数据寄存器值,哪位为 1 哪位亮,如第 3 个灯亮二进制表示
\\定义 IO 工作方式寄存
器地址
#define IOPCON (* (volatile unsigned *) 0x03ff5004)
\\定义 IO 控制寄存器
地址
#define IOPDATA (* (volatile unsigned *) 0x03ff5008)
\\定义 IO 数据寄存器
地址
rSYSCFG EQU 0xE7FFFF90 ;各寄存器的待设数值 rEXTDBWTH EQU 0x00003002 rREFEXTCON EQU 0xCE338360
rfROMCON0 EQU 0x02000060 rfSDRAMCON0 EQU 0x14010380 rsROMCON0 EQU 0x14048060 rsSDRAMCON0 EQU 0x10000380 rROMCON1 EQU 0x0 rROMCON2 EQU 0x0 rROMCON3 EQU 0x0 rROMCON4 EQU 0x0 rROMCON5 EQU 0x0 rSDRAMCON1 EQU 0x0 rSDRAMCON2 EQU 0x0 rSDRAMCON3 EQU 0x0
#define UTXBUF1 (* (volatile unsigned *) 0x03ffe00c) \\定义 UART1 发送缓存寄存器
#define URXBUF1 (* (volatile unsigned *) 0x03ffe010) \\定义 UART1 接收缓存寄存器
#define UBRDIV1 (* (volatile unsigned *) 0x03ffe014) \\定义 UART1 波特率分频寄存
IOPMOD EQU 0x3FF5000 IOPCON EQU 0x3FF5004 IOPDATA EQU 0x3FF5008 CODE32 AREA Init,CODE,READONLY ENTRY B RESET NOP NOP NOP NOP NOP NOP NOP RESET
;*************************************************** ;MASK ALL INTERRUPTS ;***************************************************
在开始我们的烧写工作之前,需要先处理一件很重要的事情,这个就是我们的 Boot Loader, 这是启动系统的关键。
在 ADS 中编写 Boot Loader 程序。
;**************************Boot Loader By Leo 2011 All Rights Reserved**************************************
器
void Delay(unsigned int x); \\延时函数声明 void InitUART(int Port,int Baudrate); \\串口初始化函数声明 void PrintUART(int Port,char *s); \\串口输出函数声明
int main() \\主函数 { InitUART(0,0x500); \\初始化串口 0,波特率 19200
void InitUART(int Port,int Baudrate) \\串口初始化函数体 { if(Port==0) { ULCON0=0x03; UCON0=0x09; UBRDIV0=Baudrate; } if(Port==1) { ULCON1=0x03; UCON1=0x09; UBRDIV1=Baudrate; } }
Delay(10000); \\即 00000100B,16 进制为 0x04
IOPDATA=0x02;
Delay(10000);
IOPDATA=0x04;
Delay(10000);
IOPDATA=0x08;
Delay(10000);
}
return 0;
}
第二个程序 串口通信
#define IOPMOD (* (volatile unsigned *) 0x03ff5000)
LDR R1,=SYSCFG LDR R0,=rSYSCFG STR R0,[R1]
LDR R1,=EXTDBWTH LDR R0,=rEXTDBWTH STR R0,[R1]
LDR r0,=ROMCON0
LDR r1,=rfROMCON0
LDR r2,=rROMCON1 LDR r3,=rROMCON2 LDR r4,=rROMCON3 LDR r5,=rROMCON4 LDR r6,=rROMCON5 LDR r7,=rfSDRAMCON0 LDR r8,=rSDRAMCON1 LDR r9,=rSDRAMCON2 LDR r10,=rSDRAMCON3 LDR r11,=rREFEXTCON STMIA r0,{r1-r11}
#define UTXBUF0 (* (volatile unsigned *) 0x03ffd00c) \\定义 UART0 发送缓存寄存器
#define URXBUF0 (* (volatile unsigned *) 0x03ffd010) \\定义 UART0 接收缓存寄存器
#define UBRDIV0 (* (volatile unsigned *) 0x03ffd014) \\定义 UART0 波特率分频寄存
Fra Baidu bibliotek
器
#define ULCON1 (* (volatile unsigned *) 0x03ffe000) \\定义 UART1 线控制寄存器地址
#define UCON1 (* (volatile unsigned *) 0x03ffe004) \\定义 UART1 控制寄存器地址
#define USTAT1 (* (volatile unsigned *) 0x03ffe008) \\定义 UART1 状态寄存器
我是把 arm-elf-tools-20030314.sh 放在 root 里面的,所以命令如下
sudo su
cd ~/
vi arm-elf-tools-20030314.sh
将这个文件的第 38 行改成这个样子
然后重启系统之后,就可以用 root 登录终端./arm-elf-tools-20030314.sh 命令安装了(具 体 vi 命令请参见网络上的说明)
保存,退出
一步步执行,直到在“Main Menu“中选上我们的“Test Program“
这样我们就设置结束了,保存退出,分别执行"make dep"、"make clean"、"make lib_only"、 "make user_only"、"make_romfs"、"make image"生成我们的 rom 文件,值得注意的是有时 在"make image"时会出错,这个时候需要用"make linux"命令重新编译 linux 内核即可。
#define ULCON0 (* (volatile unsigned *) 0x03ffd000) \\定义 UART0 线控制寄存器地址
#define UCON0 (* (volatile unsigned *) 0x03ffd004) \\定义 UART0 控制寄存器地址
#define USTAT0 (* (volatile unsigned *) 0x03ffd008) \\定义 UART0 状态寄存器
**要注意到 all、romfs、clean 等后面是具体 GCC 命令,必须换行后 Tab 一下才能识别,这 是语法问题! 下一步建立 user 文件夹下的 Makefile
添加如标注的两行,这样就能告诉编译器我们需要编译的东东
下面我们需要让“make menuconfig”能够显示出我们的程序来就还需要设置 "~/Uclinux-dist/config"目录下的“config.in”文件
第一个程序------跑马灯
#define IOPMOD (*(volatile unsigned *) 0x03ff5000) \\定义 IO 工作方式寄存器端口地 址 #define IOPDATA (*(volatile unsigned *) 0x03ff5008) \\定义 IO 数据寄存器地址
添加如图所示的代码。
最后,需要这两个程序自动启动的话还需要修改 “~/uClinux-dist/Vendors/Samsung/4510B/"下的 rc 文件,向其最后添加 “./bin/led& ./bin/uart&" 两行代码。 完成这些以后,我们就可以开始编译了
在“Target Platform Selection"中选择“Customize Kernel Settings (NEW)“和”Customize Vendor/User Settings (NEW)“
这个很坑爹的工具安装好了以后,就可以解压 uClinux-dist.tar.gz,解压在主文件夹是个 不错的选择,root 里面要向外复制的话文件权限 不好解决。
解压好了 uClinux-dist.tar.gz 之后,就可以先在目录下 make menuconfig 看一看内核设置 之类的东东了
当然,现在只是一个开始,还是得添加自己的一些程序到系统里,所以先退出,编写下要用 到的东西
这次我选择了用 Ubuntu 这个版本的 linux 作为我的开发环境,是因为它的界面还算友好, 对于我这种 linux 白痴一样的人能少用一点命令那是再好不过了的。可是我没有想到 Ubuntu 可以这样的坑爹,由于用的 shell 和别个的 linux 不同,所以直接导致 arm-elf-tools-20030314.sh 不能打开,所以更别说安装了。Google 了很久,终于不得不去 面对了一个现实,就是我偷懒不想用命令,结果我得用更多的命令去安装这个该死的工具。
void Delay(unsigned int x) { unsigned int i,j,k;
for(i=0;i<=x;i++) for(j=0;j<0xff;j++) for(k=0;k<0xff;k++); } 将这两个文件放到“~/uClinux-dist/user”下新建的文件夹“new_ap”中,接下来就是为 这两个文件建立 Makefile
SYSCFG EQU 0x3FF0000 ;定义系统设置寄存器地址 EXTDBWTH EQU 0x3FF3010 ;总线宽度寄存器地址
ROMCON0 EQU 0x3FF3014 ;ROM 配置寄存器地址 SDRAMCON0 EQU 0x3FF303C ;SDRAM 配置寄存器地址 REFEXTCON EQU 0x3FF303C ;刷新与外部寄存器地址
记 ubuntu 的 uClinux 交叉编译环境的搭建以及操作系统的引导
1、uClinux 交叉编译环境的搭建
从 www.uclinux.org 下载好的文件有 arm-elf-tools-20030314.sh 和 uClinux-dist.tar.gz, 其中前者是编译工具,后者是 uClinux 的内核源码,我们就是利用这个工具编译裁剪好了的 系统。
Delay(10); while(1) { Delay(10); PrintUART(0,"Hello World!"); \\输出“Hello World!” } return 0; }
void PrintUART(int port,char *s) \\串口输出函数体 { if(port==0) \\若是串口 0 for(;*s!='\0';s++) \\输出字符串*s,遇到换行符停止 { for(;(!(USTAT0&0x40));); \\状态寄存器第七位为 1 时停止输出,因为代表结束帧 UTXBUF0=*s; \\发送缓存寄存器置字符 } if(port==1) \\若是串口 1 for(;*s!='\0';s++) { for(;(!(USTAT0&0x40));); UTXBUF1=*s; } }
void Delay(int i) \\延时函数 { int j,k; for(j=0;j<i;j++) { k=0; } }
int main(void) {
\\主函数--------跑马灯
IOPMOD=0xffffffff;
\\设置 IO 工作方式为输出
while(1)
{
IOPDATA=0x01; \\设置 IO 数据寄存器值,哪位为 1 哪位亮,如第 3 个灯亮二进制表示
\\定义 IO 工作方式寄存
器地址
#define IOPCON (* (volatile unsigned *) 0x03ff5004)
\\定义 IO 控制寄存器
地址
#define IOPDATA (* (volatile unsigned *) 0x03ff5008)
\\定义 IO 数据寄存器
地址
rSYSCFG EQU 0xE7FFFF90 ;各寄存器的待设数值 rEXTDBWTH EQU 0x00003002 rREFEXTCON EQU 0xCE338360
rfROMCON0 EQU 0x02000060 rfSDRAMCON0 EQU 0x14010380 rsROMCON0 EQU 0x14048060 rsSDRAMCON0 EQU 0x10000380 rROMCON1 EQU 0x0 rROMCON2 EQU 0x0 rROMCON3 EQU 0x0 rROMCON4 EQU 0x0 rROMCON5 EQU 0x0 rSDRAMCON1 EQU 0x0 rSDRAMCON2 EQU 0x0 rSDRAMCON3 EQU 0x0
#define UTXBUF1 (* (volatile unsigned *) 0x03ffe00c) \\定义 UART1 发送缓存寄存器
#define URXBUF1 (* (volatile unsigned *) 0x03ffe010) \\定义 UART1 接收缓存寄存器
#define UBRDIV1 (* (volatile unsigned *) 0x03ffe014) \\定义 UART1 波特率分频寄存
IOPMOD EQU 0x3FF5000 IOPCON EQU 0x3FF5004 IOPDATA EQU 0x3FF5008 CODE32 AREA Init,CODE,READONLY ENTRY B RESET NOP NOP NOP NOP NOP NOP NOP RESET
;*************************************************** ;MASK ALL INTERRUPTS ;***************************************************
在开始我们的烧写工作之前,需要先处理一件很重要的事情,这个就是我们的 Boot Loader, 这是启动系统的关键。
在 ADS 中编写 Boot Loader 程序。
;**************************Boot Loader By Leo 2011 All Rights Reserved**************************************
器
void Delay(unsigned int x); \\延时函数声明 void InitUART(int Port,int Baudrate); \\串口初始化函数声明 void PrintUART(int Port,char *s); \\串口输出函数声明
int main() \\主函数 { InitUART(0,0x500); \\初始化串口 0,波特率 19200
void InitUART(int Port,int Baudrate) \\串口初始化函数体 { if(Port==0) { ULCON0=0x03; UCON0=0x09; UBRDIV0=Baudrate; } if(Port==1) { ULCON1=0x03; UCON1=0x09; UBRDIV1=Baudrate; } }
Delay(10000); \\即 00000100B,16 进制为 0x04
IOPDATA=0x02;
Delay(10000);
IOPDATA=0x04;
Delay(10000);
IOPDATA=0x08;
Delay(10000);
}
return 0;
}
第二个程序 串口通信
#define IOPMOD (* (volatile unsigned *) 0x03ff5000)
LDR R1,=SYSCFG LDR R0,=rSYSCFG STR R0,[R1]
LDR R1,=EXTDBWTH LDR R0,=rEXTDBWTH STR R0,[R1]
LDR r0,=ROMCON0
LDR r1,=rfROMCON0
LDR r2,=rROMCON1 LDR r3,=rROMCON2 LDR r4,=rROMCON3 LDR r5,=rROMCON4 LDR r6,=rROMCON5 LDR r7,=rfSDRAMCON0 LDR r8,=rSDRAMCON1 LDR r9,=rSDRAMCON2 LDR r10,=rSDRAMCON3 LDR r11,=rREFEXTCON STMIA r0,{r1-r11}
#define UTXBUF0 (* (volatile unsigned *) 0x03ffd00c) \\定义 UART0 发送缓存寄存器
#define URXBUF0 (* (volatile unsigned *) 0x03ffd010) \\定义 UART0 接收缓存寄存器
#define UBRDIV0 (* (volatile unsigned *) 0x03ffd014) \\定义 UART0 波特率分频寄存
Fra Baidu bibliotek
器
#define ULCON1 (* (volatile unsigned *) 0x03ffe000) \\定义 UART1 线控制寄存器地址
#define UCON1 (* (volatile unsigned *) 0x03ffe004) \\定义 UART1 控制寄存器地址
#define USTAT1 (* (volatile unsigned *) 0x03ffe008) \\定义 UART1 状态寄存器