【嵌入式开发】 嵌入式开发工具简介 (裸板调试示例 | 交叉工具链 | Makefile | 链接器脚本 | eclipse JLink 调试环境)(一)

简介: 【嵌入式开发】 嵌入式开发工具简介 (裸板调试示例 | 交叉工具链 | Makefile | 链接器脚本 | eclipse JLink 调试环境)(一)

一. 编译并烧写裸板程序示例





1. 设置交叉编译工具



OK-6410-A 使用 4.3.2 的交叉编译工具链, 将交叉编译工具链设置成 Ubuntu 的默认交叉编译工具链;




安装交叉编译工具链 : 解压 arm-linux-gcc-4.3.2.tgz 文件


-- 安装命令 : 使用命令 tar -xvzf arm-linux-gcc-4.3.2.tgz -C /, 由于 tgz 压缩文件内也是存在目录结构, 解压后, 交叉编译工具链直接解压到了 /usr/local/arm/4.3.2 目录;


-- 配置环境变量 : 环境变量在 /etc/profile 中配置, 在该文件中添加如下代码 :



ARM_LINUX="/usr/local/arm/4.3.2/bin"
export PATH=$PATH:$ARM_LINUX
-- 使配置文件生效 : 执行 source /etc/profile 命令, 该配置即可生效, 执行 arm-linux 按 tab 键 : 
octopus@octopus:~$ arm-linux-
arm-linux-addr2line  arm-linux-c++filt    arm-linux-gcc-4.3.2  arm-linux-gprof      arm-linux-objdump    arm-linux-sprite
arm-linux-ar         arm-linux-cpp        arm-linux-gcov       arm-linux-ld         arm-linux-ranlib     arm-linux-strings
arm-linux-as         arm-linux-g++        arm-linux-gdb        arm-linux-nm         arm-linux-readelf    arm-linux-strip
arm-linux-c++        arm-linux-gcc        arm-linux-gdbtui     arm-linux-objcopy    arm-linux-size




2. 编译代码






(1) 代码示例



代码直接是开发板的示例代码:


-- led.S :



octopus@octopus:~/arm/01_code$ more led.S 
.text
.globl _start
#define VIC0_INT  0x71200000
#define VIC1_INT  0x71300000
_start: bl reset
  ldr pc, _undefined_instruction
  ldr pc, _software_interrupt
  ldr pc, _prefetch_abort
  ldr pc, _data_abort
  ldr pc, _not_used
  ldr pc, _irq
  ldr pc, _fiq
_undefined_instruction:b .
_software_interrupt:b .
_prefetch_abort:b .
_data_abort:b .
_not_used:b .
_irq:b .
_fiq:b .
reset:
  mrs r0,cpsr
  bic r0,r0,#0x1f
  orr r0,r0,#0xd3
  msr cpsr,r0
  bl set_peri_port
  bl disable_watchdog
  bl disable_irq
  bl init_led
  bl light_led
halt:
  bl halt
set_peri_port:
@告诉cpu外设的地址
     ldr r0, =0x70000000
     orr r0, r0, #0x13
     mcr p15,0,r0,c15,c2,4
  mov pc, lr
disable_watchdog:
@关闭看门狗
  ldr r0, =0x7E004000
  mov r1, #0
  str r1, [r0] @ str, store,
  mov pc, lr
disable_irq:
@屏蔽中断
  ldr r1, =0x0
  ldr r0, =VIC0_INT
  str r1, [r0]
  ldr r1, =0x0
  ldr r0, =VIC1_INT
  str r1, [r0]
  mov pc, lr
init_led:
@设置GPN为输出模式
  ldr r1, =0x7F008820
  ldr r0, =0x1111
  str r0, [r1]
  mov pc, lr
light_led:
@点亮LED1
  ldr r1, =0x7F008824
  mov r0, #0xf
  str r0, [r1]
     mov r0,#0xe
     str r0,[r1]
     mov  pc, lr
-- led.lds : 
octopus@octopus:~/arm/01_code$ more led.lds 
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
  . = 0x50008000;
  . = ALIGN(4);
  .text :
  {
  led.o (.text)
  *(.text)
  }
  . = ALIGN(4);
  .rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }
  . = ALIGN(4);
  .data : { *(.data) }
  . = ALIGN(4);
  __bss_start = .;
  .bss (NOLOAD) : { *(.bss) . = ALIGN(4); }
  _end = .;
}
-- Makefile : 
octopus@octopus:~/arm/01_code$ more Makefile 
all: led.o 
  arm-linux-ld -Tled.lds -o led.elf led.o
  arm-linux-objcopy -O binary led.elf led.bin
led.o : led.S
  arm-linux-gcc -g -o led.o -c led.S
.PHONY: clean
clean:
  rm *.o led.elf led.bin






(2) 编译


编译 : 在该目录执行 make 命令, 编译后多了 led.o, led.elf, led.bin 三个文件, 其中 led.bin 是要烧写到 nand flash 中的可执行二进制程序;


-- 编译前 :



octopus@octopus:~/arm/01_code$ ls
led.lds  led.S  Makefile

-- 编译后 :



octopus@octopus:~/arm/01_code$ make
arm-linux-gcc -g -o led.o -c led.S
arm-linux-ld -Tled.lds -o led.elf led.o
arm-linux-objcopy -O binary led.elf led.bin
octopus@octopus:~/arm/01_code$ ls
led.bin  led.elf  led.lds  led.o  led.S  Makefile





3. 烧写 led.bin




(1) 启动方式切换



sd 卡启动 : (1~8) 位置 : 0, 0, 0, 1, 1, 1, 1, 1;


nand flash 启动 : (1~8) 位置 : x, x, x, 1, 1, 0, 0, 1;


nor flash 启动 : (1~8) 位置 : x, x, x, 1, 0, 1, 0, x;






(2) 制作SD卡启动盘


详细过程参照 : http://blog.csdn.net/shulianghan/article/details/42254237#t42






(3) 串口操作



开发板串口方案一 -- 使用SecureCRT 串口连接 :


-- 设备管理器中查看串口端口 : COM7;


image.png


-- 串口连接属性 :

image.png



-- 连接串口 :


image.png






开发板串口方案二 -- 打开 minicom 工具 : minicom 串口调试工具;


-- 注意 : 使用 root 用户打开, sudo minicom;




sd 卡启动 :


-- 启动方式 : 插入 sd 卡, 将启动模式设置为 sd 卡启动, 即将 屏幕右侧的 8个开关设置成 (1~8) 位置 : 0, 0, 0, 1, 1, 1, 1, 1, 打开电源;


-- 注意 : 打开电源时 不停按 空格键;


-- 串口终端显示 :



U-Boot 1.1.6 (Oct  9 2012 - 13:20:58) for SMDK6410
****************************************
**    u-boot 1.1.6                    **
**    Updated for OK6410  TE6410 Board  **
**    Version (2012-09-23)          **
**    OEM: Forlinx Embedded           **
**    Web: http://www.witech.com.cn   **
****************************************
CPU:     S3C6410 @532MHz
         Fclk = 532MHz, Hclk = 133MHz, Pclk = 66MHz, Serial = CLKUART (SYNC Mode) 
Board:   SMDK6410
DRAM:    256 MB
Flash:   0 kB
NandFlash Information:
Nandflash:ChipType= SLC  ChipName=MT29F16G08ABACAWP
No  No Calc pagesize, blocksize, erasesize,  use ids table .............
NandFlash:name=NAND 2GiB 1,8V 8-bit,id=38, pagesize=4096 ,chipsize=1024 MB,erasesize=524288 oobsize=128
NandFlash Size is 1024 MB 
SD/MMC:  SD 2.0 / Manufacturer: 0x1B,OEM: "SM/00000",REV: 1.0,S/N: -1320320343,DATE: 2008/3
         MMC/SD size: 971 MiB
         Freq = 25MHz
In:      serial
Out:     lcd
Err:     lcd
Hit any key to stop autoboot:  0 
###################### User Menu for OK6410#####################
[1] Format the nand flash
[2] Burn image from SD card
[3] Burn image from USB
[4] Reboot the u-boot
[5] Exit to command line
-----------------------------Select---------------------------------
Enter your Selection:




格式化 nand flash : 在上面的 minicom 命令行, 选择 1 ([1] Format the nand flash -- 格式化 nand Flash), 弹出 Really scrub this NAND flash? <y/N> 时 选择 y;



-----------------------------Select---------------------------------
Enter your Selection:1
NAND scrub: device 0 whole chip
Warning: scrub option will erase all factory set bad blocks!
         There is no reliable way to recover them.
         Use this command only for testing purposes if you
         are sure of what you are doing!
Really scrub this NAND flash? <y/N>
Erasing at 0x3ff80000 -- 100% complete.
Scanning device for bad blocks
OK
###################### User Menu for OK6410#####################
[1] Format the nand flash
[2] Burn image from SD card
[3] Burn image from USB
[4] Reboot the u-boot
[5] Exit to command line
-----------------------------Select---------------------------------
Enter your Selection:



选择从 usb 烧写映像 : 选择 3 ([3] Burn image from USB -- 从usb烧写映像);



-----------------------------Select---------------------------------
Enter your Selection:3
##### Select the fuction #####
[1] Flash u-boot
[2] Flash kernel
[3] Flash system
[4] Exit
Enter your Selection:

选择 烧写 u-boot 类型程序 : 裸板程序都属于 u-boot 类型的;



 
         



设置虚拟机的 USB 接口 : 之前写过, 详情见 http://blog.csdn.net/shulianghan/article/details/42254237#t45 ;




(3) Linux 操作



编译 led 源码 :


-- 进入 led 源码目录 : 执行 make 命令, 将编译后的文件 拷贝到 dnw 所在目录;


image.png




烧写 led.bin :


-- 加载 dnw 驱动 : 使用 insmod dnw_usb.ko 命令;

image.png



-- 烧写 led.bin : 使用 ./dnw led.bin 50008000 命令;

image.png



-- 串口终端显示 : 如下显示, 烧写成功;

image.png



-- 关闭开发板使用 nand flash 启动 : 可以看到 LED1 点亮;









二. 交叉工具链






1. 交叉编译器





(1) 普通编译


编译下面的代码 :



/*************************************************************************
    > File Name: main.c
    > Author: octopus
    > Mail: octopus_work.163.com 
    > Created Time: 2015年01月03日 星期六 14时25分11秒
 ************************************************************************/
#include<stdio.h>
int main(int argc, char** argv)
{
  printf("Hello World!\n");
  return 0;
}

-- 编译执行代码 :


[root@localhost 02_gcc_demo]# gcc main.c 
[root@localhost 02_gcc_demo]# ./a.out 
Hello World!




(2) 交叉编译并在开发板运行



交叉编译 : 使用 arm-linux-gcc main.c 命令交叉编译, 经过交叉编译的 a.out 不能再 x86 平台执行;

image.png





使用 U 盘将程序拷贝到开发板 : 将 a.out 拷贝到 U 盘, 然后将 U 盘拷贝到开发板上;


-- 拷贝命令 : cp a.out /media/UUI/, UUI 是 U 盘名称;


-- 开发板插入 U 盘 : 将 U 盘插入开发板(已安装 Linux 操作系统) USB 口, 根目录下出现 udisk 目录, 该目录就是 U 盘;


-- 执行交叉编译后的程序 : 执行 a.out 程序, 执行成功;

image.png







(3) 交叉|普通编译结果对比




对比交叉编译 和 普通编译 的可执行文件 : 通过 file 命令对比可执行文件;


-- 交叉编译 : 使用 arm-linux-gcc main.c -o hello-arm 命令交叉编译结果 hello-arm, 使用 file hello-arm 命令查看文件属性;



 
         

-- 普通编译 : 使用 gcc main.c -o hello-x86 命令普通编译结果 hello-x86, 使用 file hello-x86 命令查看文件属性;



[root@localhost 02_gcc_demo]# file hello-x86 
hello-x86: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, not stripped

image.png



(4) 查找目录




查看查找目录 : 使用 arm-linux-gcc -print-search-dirs 命令查看;



[root@localhost ~]# arm-linux-gcc -print-search-dirs
install: /usr/local/arm/4.3.2/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.2/
programs: =/usr/local/arm/4.3.2/bin/../libexec/gcc/arm-none-linux-gnueabi/4.3.2/:/usr/local/arm/4.3.2/bin/../libexec/gcc/:/usr/local/arm/4.3.2/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.2/../../../../arm-none-linux-gnueabi/bin/arm-none-linux-gnueabi/4.3.2/:/usr/local/arm/4.3.2/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.2/../../../../arm-none-linux-gnueabi/bin/
libraries: =/usr/local/arm/4.3.2/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.2/armv4t/:/usr/local/arm/4.3.2/bin/../lib/gcc/armv4t/:/usr/local/arm/4.3.2/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.2/../../../../arm-none-linux-gnueabi/lib/arm-none-linux-gnueabi/4.3.2/armv4t/:/usr/local/arm/4.3.2/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.2/../../../../arm-none-linux-gnueabi/lib/armv4t/:/usr/local/arm/4.3.2/bin/../arm-none-linux-gnueabi/libc/armv4t/lib/arm-none-linux-gnueabi/4.3.2/armv4t/:/usr/local/arm/4.3.2/bin/../arm-none-linux-gnueabi/libc/armv4t/lib/armv4t/:/usr/local/arm/4.3.2/bin/../arm-none-linux-gnueabi/libc/armv4t/usr/lib/arm-none-linux-gnueabi/4.3.2/armv4t/:/usr/local/arm/4.3.2/bin/../arm-none-linux-gnueabi/libc/armv4t/usr/lib/armv4t/:/usr/local/arm/4.3.2/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.2/:/usr/local/arm/4.3.2/bin/../lib/gcc/:/usr/local/arm/4.3.2/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.2/../../../../arm-none-linux-gnueabi/lib/arm-none-linux-gnueabi/4.3.2/:/usr/local/arm/4.3.2/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.2/../../../../arm-none-linux-gnueabi/lib/:/usr/local/arm/4.3.2/bin/../arm-none-linux-gnueabi/libc/armv4t/lib/arm-none-linux-gnueabi/4.3.2/:/usr/local/arm/4.3.2/bin/../arm-none-linux-gnueabi/libc/armv4t/lib/:/usr/local/arm/4.3.2/bin/../arm-none-linux-gnueabi/libc/armv4t/usr/lib/arm-none-linux-gnueabi/4.3.2/:/usr/local/arm/4.3.2/bin/../arm-none-linux-gnueabi/libc/armv4t/usr/lib/
[root@localhost ~]#






目录
相关文章
|
4月前
|
Java Android开发
在Eclipse环境下调试Java程序
在Eclipse环境下调试Java程序
57 1
|
11月前
|
Java 关系型数据库 MySQL
SSM度假村管理系统开发mysql数据库web结构java编程计算机网页源码eclipse项目
SSM 度假村管理系统是一套完善的信息系统,结合SSM框架完成本系统,对理解JSP java编程开发语言有帮助系统采用SSM框架(MVC模式开发),系统具有完整的源代码和数据库,系统主要采用B/S模式开发。 前段主要技术html div js 后端主要技术 SSM框架 java jdbc 数据库 mysql 开发工具 eclipse JDK1.8 TOMCAT 8.5
51 0
|
2月前
|
存储 Oracle Java
Java面试题:描述如何使用Eclipse或IntelliJ IDEA进行Java开发?
Java面试题:描述如何使用Eclipse或IntelliJ IDEA进行Java开发?
37 0
|
3月前
|
开发工具 Android开发 git
合作开发(Eclipse+git +码云)
合作开发(Eclipse+git +码云)
46 0
|
4月前
|
Java 关系型数据库 BI
基于Java Swing 开发的网吧管理系统【eclipse和idea两个版本运行源码】
基于Java Swing 开发的网吧管理系统【eclipse和idea两个版本运行源码】
110 0
|
4月前
|
设计模式 前端开发 Java
Spring Boot之Spring MVC的工作原理 以及使用eclipse开发Spring MVC的Web应用实战(附源码)
Spring Boot之Spring MVC的工作原理 以及使用eclipse开发Spring MVC的Web应用实战(附源码)
82 0
|
4月前
|
Android开发
Eclipse工具使用技巧
Eclipse工具使用技巧
|
11月前
|
Java 关系型数据库 MySQL
SSM宾馆客房管理系统开发mysql数据库web结构java编程计算机网页源码eclipse项目
SSM 宾馆客房管理系统是一套完善的信息系统,结合springboot框架和bootstrap完成本系统,对理解JSP java编程开发语言有帮助系统采用SSM框架(MVC模式开发),系统具有完整的源代码和数据库,系统主要采用B/S模式开发。 前段主要技术 bootstrap.css jquery 后端主要技术 SSM 数据库 mysql 开发工具 eclipse JDK1.8 TOMCAT 8.5
58 0
SSM宾馆客房管理系统开发mysql数据库web结构java编程计算机网页源码eclipse项目
|
10月前
|
Java 关系型数据库 Apache
Apache Maven简介&安装及系统坏境配置&eclipse配置Apache Maven---详细介绍
Apache Maven简介&安装及系统坏境配置&eclipse配置Apache Maven---详细介绍
117 0
|
11月前
|
Java 关系型数据库 MySQL
SSM培训报名管理系统开发mysql数据库web结构java编程计算机网页源码eclipse项目
SSM 培训报名管理系统是一套完善的信息系统,结合SSM框架完成本系统,对理解JSP java编程开发语言有帮助系统采用SSM框架(MVC模式开发),系统具有完整的源代码和数据库,系统主要采用B/S模式开发。 前段主要技术html div js 后端主要技术 SSM框架 java jdbc 数据库 mysql 开发工具 eclipse JDK1.8 TOMCAT 8.5
48 0

推荐镜像

更多