0
点赞
收藏
分享

微信扫一扫

嵌入式系统开发笔记

嵌入式概念:

是应用为中心,以计算机技术为基础,软硬件可裁剪,对功耗、体积、可靠性、成本都有严格要求的专用计算机系统。

内存寻址

  • 独立寻址:片内片外存储器只能选择其中一个(芯片内部有标志引脚,使用高低电平来表示读取片内或者片外)
  • 统一寻址:片内片外存储器都能使用,且使用的是同一片连续的寻址空间。

软件怎么访问硬件设备

  1. 软件==》 内存 ==》 内存映射 ==》 硬件控制寄存器 ==》 硬件
  2. 怎么直接通过内存地址实现对串口(uart)数据的发送
  • 通过原理图结合开发板找到与PC相连的串口uart0
  • 通过数据手册查找uart0的发送数据寄存器地址映射到了内存什么地址
  • 发送数据地址为:0xc00a1020
  • 向0xc00a1020写入数据完成发送,数据值最好大于32(空格),小于32也可以发送,只是不可见
  • mw 0xc00a1020 0x41(A)

裸机开发的基本特点

  • 没有操作系统(Linux)
  • 不使用带有系统调用的标准C库
  • 大量使用物理内存地址进行数据操作
  • 如果要用到库函数,需要自己去实现
  • 将编译和链接分步骤完成,实现对可执行程序的指定链接,并指定连接地址
  • Linux 操作系统一般支持可执行文件格式elf,在裸机环境下不好使
  • 需要将elf格式裁剪成纯净的二进制可执行文件
  • 将纯二进制文件下载到链接时指定的物理内存空间,修改PC指向开始执行

程序的编译链接过程分解

  • gcc -o main main.c 可以分解成以下步骤(可执行程序main的隐藏后缀是 .elf)
  • gcc -E -o main.i main.c
  • gcc -S -o main.S main.i
  • gcc -c -o main.o main.S
  • gcc -o main.elf main.o

安装交叉编译器

裸机代码编译流程

只编译不链接:arm-linux-gcc -c -o t.o t.c

链接并指定地址:arm-linux-ld -o t t.o -Ttext=0x48000000

链接并指定地址(修改程序入口函数):arm-linux-ld -o t t.o -Ttext=0x48000000 -e main

Boot 概念

启动引导,自举程序

由于boot设计比较偏底层,所以根据CPU架构和OS类型可能有所不同

uboot是对CPU架构和OS类型支持得比较多的一种开源引导程序

s5p6818启动流程

  • 芯片最初是从iROM启动,叫BL0
  • iROM选择启动的下一阶段引导程序BL1
  • 单阶段启动:如果BL1可以完成内核加载,这就是单阶段启动
  • 多阶段启动:启动加载内核的工作由BL2之后的程序完成,这就是多阶段启动
  • 为什么BL1不直接加载到DDR
  • SRAM比DDR更快
  • DDR需要初始化,而SRAM不需要(总线结果不需要初始化,直接拿来就能使用)

BL1启动Bootloader第二阶段BL2

BL2启动内核

内核加载根文件系统

引导传参

  • 所传数据结构必须约定一致
  • 引导程序与内核之间必须约定一个参数存放的地址DDR Base+0x100(0x400000100)
  • 数据格式约定一致
  • 比如用户传给内核的参数:
  • bootargs root=/dev/mmcblk0p8 rw rootfstype=ext4 init=/linuxrc lcd=wy070ml tp=gslx680

uboot介绍

  • u-boot最初是由PPCBoot发展而来的
  • u-boot已经成为当前主流引导程序
  • 官方引导程序由于与硬件平台差异,所以并不能下载直接运行(需要经过调试和修改及移植)
  • 编译uboot
  • 源码获取:
  • 下载地址:http://git.denx.de/?p=u-boot.git;a=summary
  • 从芯片原厂获取配套的BSP

配置编译uboot

  • 进入uboot源码目录:cd u-boot
  • 清除编译痕迹(只是第一次做):make distclean
  • 编译前配置成目标平台:make 6818_config
  • 编译源码:make
  • 编译完成后在源码根目录下会生成镜像:ubootpak.bin

镜像烧录

  • 找到官方提供的标准镜像
  • boot.img
  • gtkfs.img
  • ubootpak.bin
  • 开发板开机进入uboot命令行模式
  • 执行下载命令:fastboot
  • 插入miniUSB下载线
  • 如果打开了虚拟机,要确认USB连接到物理主机
  • 在PC设备管理可以发现Android device并确认是否安装驱动
  • 未安装驱动则需要重新安装,安装完驱动后重新插拔USB线
  • 修改下载脚本文件
  • REM表示注释一行
  • 下载uboot:fastboot flash ubootpak ../linux_image/ubootpak.bin
  • 下载内核:fastboot flash boot ../linux_image/boot.img
  • 下载根文件系统:flash gtkfs ../linux_image/gtkfs.img
  • 可写脚本完成三步下载
  • 下载完成,开发板提示: Flash : ubootpak - DONE
  • 下载完成后,Ctrl+C退回到命令行,获直接重启开发板即可


举报

相关推荐

0 条评论