1.17k likes | 1.32k Views
嵌入式操作系统实验. 试验安排. 试验一:bootloader (ads、引导) 试验二:linux kernel (gcc、make) 试验三:linux driver (uart) 试验四:linux driver (touchscreen) 试验五:GPRS综合试验 (framebuffer) 试验六:GPRS综合试验. 主要内容. 1、 硬件平台 2、处理器结构 3、软件平台 4、调试方法 5、试验注意事项. 硬 件 平 台. 硬件平台. 硬件平台. 1、处理器:三星S3C2410,200MHZ 2、内存:SDRAM,64M
E N D
试验安排 • 试验一:bootloader (ads、引导) • 试验二:linux kernel (gcc、make) • 试验三:linux driver (uart) • 试验四:linux driver (touchscreen) • 试验五:GPRS综合试验 (framebuffer) • 试验六:GPRS综合试验
主要内容 1、 硬件平台 2、处理器结构 3、软件平台 4、调试方法 5、试验注意事项
硬件平台 1、处理器:三星S3C2410,200MHZ 2、内存:SDRAM,64M 3、外存:NAND FLASH,64M 4、LCD&触摸屏:SHARP,640×480,TFT 5、串口:RS232,RS485
CPU SDRAM IDE插槽 LCD&触摸屏 网口 串口 SD卡 键盘 电机 PCMCIA卡
处理器结构 1、处理器核心 MMU,DCACHE,ICACHE,JTAG 2、系统总线 SDRAM,FLASH,LCD,中断,USB 3、外部总线 串口,USB,GPIO
处理器核 系统总线 外部总线
从NAND Flash(非线性Flash)启动 处理器地址映射 CPU控制寄存器 内存SDRAM 静态片选,可接flash、网卡等芯片 CPU内部引导RAM
处理器地址映射 从NOR Flash(线性Flash)启动 CPU控制寄存器 内存SDRAM 静态片选,可接flash、网卡等芯片 引导用的flash
①CPU上电后自动将Nand flash上的4KB引导代码即bootloader拷贝到内部引导RAM,并启动运行; ②引导代码将操作系统拷贝到内存; ③操作系统启动运行,设置堆栈,初始化变量等; ④操作系统拷贝中断向量表到0x0地址,即CPU内部RAM; ⑤操作系统转入正常运行。 处理器引导方式 NAND Flash 64MB ③ ② 0x30000000 ④ 4KB ① 0x0
引导步骤 -- NAND flash 引导 CPU复位 CPU片内程序通过nand flash控制器读取nand flash第一块程序(4KB)到片内SRAM 硬件自动 CPU置PC指针到片内SRAM的0地址 4KB引导程序运行,进行基本初始化,将操作系统核心从flash中搬到SDRAM中 软件 引导程序将控制权交给操作系统,操作系统开始运行
引导步骤 -- NOR flash 引导 CPU复位 硬件自动 CPU置PC指针到物理0地址(该地址必须为nor flash) 引导程序运行,进行基本初始化,将操作系统核心从flash中搬到SDRAM中 软件 引导程序将控制权交给操作系统,操作系统开始运行
bootloader引导原理 4KB引导代码 其它部分:初始化,flash、串口驱动 bootloader组成 引导程序搬运bootloder其它部分(如果有的话)到SDRAM 在Nand Flash引导方式下,CPU加电后被首先搬运到内部SRAM中运行。引导代码的工作方式如右边流程图。 bootloader其它部分开始运行,初始化串口,通过串口将信息打印到主机并接收主机指令 bootloader根据主机指令选择搬运Linux核心到SDRAM bootloader启动Linux核心运行
bootloader工作方式 主机使用串口与bootloader交互 bootloader开始运行后,主机通过超级终端与bootloader交互,向其发出命令或者发送文件 我们可通过超级终端控制bootloader实现:下载程序到SDRAM运行、引导Flash上的操作系统运行、烧写Flash,所有这些操作不需要使用JTAG口。
通常的NAND Flash地址分配 Linux 的数据文件系统 Linux 核心所在的分区 Linux 的根文件系统
软件平台 1、嵌入式操作系统:裁减后的Linux 2、引导软件(bootloader) • bootloader:通过串口与主机交互,可下载并烧写程序 3、编译、调试工具 • ADS1.2:管理、编译、调试ARM工程 • UArmJtag:软件仿真器,通过UArmJtag控制JTAG口,实现程序下载、调试 • gcc:编译Linux核心及应用
主机 ADS1.2编辑、编译ARM工程 ADS使用uArmJtag软件仿真器下载、跟踪工程 目标机 工程在目标板上执行,输出结果 bootloader调试方法
JTAG线 ADS1.2 目标机的JTAG口 生成的映像文件 uArmJtag 通过主机的并口下载映象文件
主机 gcc编辑、编译Linux核心工程 使用bootloader或硬件仿真器下载、运行、跟踪核心 目标机 Linux核心在目标板上执行,加载root文件系统,调试应用程序 Linux核心调试方法
串口工具 Linux核心运行后,通过网络加载root文件系统 生成的Linux核心映像文件 网口 串口 串口线 通过主机的串口下载Linux核心映象文件,核心运行后通过网络加载主机nfs服务上的root文件系统
试验注意事项 1、不要用手或者导体接触目标板,以免造成芯片短路; 2、插/拔JTAG、串口等连接线以及各种插卡时要先断开电源,防止静电损坏电路; 3、将水杯、钥匙等放在离目标板较远的位置; 4、离开时注意切断目标板电源。 5、不要用笔或指甲尖点击触摸屏。 6、实验完毕检查串口线、并口线、jtag接口、电源线等是否完整。
考核方式 • 以组为单位考核,不允许随意变动分组 • 实验一到实验六:每次15分 • 实验总结报告+建议:10分(课程建设、实验设置、课余实验、毕业设计) 交电子文档,以班为单位刻录光盘上交
试验 一 1、熟悉ADS 1.2开发工具 创建、编译、下载、调试工程 2、串口通讯 串口控制器初始化、收/发数据 3、配置主机端的nfs服务器 配置主机端的nfs服务器,以连接linux核心 4、下载并运行linux核心 使用自己的串口程序下载并运行linux核心
调试及烧写Bootloader 目标板 下载bootloader到SDRAM; 单步跟踪; 察看变量、内存; 运行bootloader; 调试 并口转Jtag线 主机 烧写bootloader到flash; 启动运行bootloader; 察看串口打印信息; 烧写
Bootloader引导Linux核心 目标板 打印菜单; 等待用户选择; 采用轮询方式从串口 读linux核心影像文件; … 收到完整linux核心影 像后启动linux核心运行; 串口线 网线 主机 linux核心启动运行; 基本的初始化; 加载nfs上的root文件系统; 显示shell命令行; 执行用户指令; 串口线
硬件复位,CPU跳转到0x0地址执行 总入口:ColdReset 关看门狗 初始化中断控制器,屏蔽所有中断 InitStacks:初始化Undef、Abort、IRQ 、FIQ 、SVC模式下的栈 exception_cploop:拷贝中断向量表到0x0地址 跳转到main()函数执行 bootloader的初始化
Bootloader的main()函数 int main(void) { ARMTargetInit(); //目标板初始化; CmdLine(); //接收用户命令,传递linux核心; return 0; }//main;
目标板初始化函数 void ARMTargetInit(void) { s3c2410_cpu_init(); //设置核心及外部时钟频率 Uart_Init(0,115200); //初始化串口 hudelay(0); //计算延时循环 NandFlash_init(); //初始化Nand Flash uHALr_InitInterrupts(); //初始化中断数据结构 uHALr_InitTimers(); //初始化操作系统时钟 uHALr_InterruptRequestInit(); //空函数 }
串口初始化 寄存器定义: #define OSULCON0 (*(volatile unsigned char *)0x50000000) #define OSUCON0 (*(volatile unsigned char *)0x50000004) #define OSUFCON0 (*(volatile unsigned char *)0x50000008) #define OSUMCON0 (*(volatile unsigned char *)0x5000000C) #define OSUBRDIV0 (*(volatile unsigned char *)0x50000028) 初始化: OSULCON0=0x03; //设置串口数据长度、停止位、奇偶校验 OSUCON0=0x85; //设置串口时钟频率、中断类型等 OSUFCON0=0x81; //设置串口FIFO工作模式 OSUMCON0=0x00; //设置流量控制等 OSUBRDIV0=0x1a; //设置串口波特率为115200bps
串口读写 寄存器定义: URXH0地址:(*(volatile unsigned char *)0x50000024) UTXH0地址:(*(volatile unsigned char *)0x50000020) 串口读写例子: void Uart_putc(char c) { while (!SERIAL_WRITE_READY()); ((UTXH0) = (c)); } unsigned char Uart_getc( ) { while( !SERIAL_CHAR_READY() ); return URXH0; }
试验一的主要工作 • 编写串口接收数据函数 • 编写串口发送数据函数 • 打印菜单,等待用户输入 • 下载并运行linux核心 • 配置主机的nfs服务器,与linux核心连接 其他部分代码从教师用机中拷贝 linux核心从教师机中拷贝
主要步骤 • 修改bootloader:菜单、串口收发、命令行; • 使用ads1.2编译bootloader; • 使用uarmjtag下载、调试bootloader;Uarmjtag不能同时打开两个; • 使用axd查看变量、内存,单步跟踪; • 配置超级终端,与bootloader通讯; • 使用超级终端下载Linux核心映像; • 启动Linux核心运行,察看结果;(bootloader调试成功后再继续以下步骤) • 将bootloader烧写到flash中,重起目标板电源,察看bootloader是否烧写正常,下载核心测试;
接收串口数据并做相应处理 while(1) { 打印菜单并等待用户输入; switch(ch) //根据用户输入做相应处理 { case '1': imgsize=xmodem_receive((char *)KERNEL_BASE, MAX_KERNEL_SIZE); if(imgsize==0) //下载出错; else //下载成功; break; case '3': nand_read((unsigned char *)KERNEL_BASE, 0x00030000, 4*1024*1024); case '2': BootKernel(); //这里是不会返回的,否则出错; break; default: break; } }
打印菜单 Uart_puts("Menu:\n\r"); Uart_puts("1.Load kernel via Xmodem;\n\r"); Uart_puts("2.Boot linux; \n\r"); Uart_puts("3.Load kernel from flash and boot; \n\r"); Uart_puts("Make your choice.\n\r"); do{ ch=Uart_getc(); }while(ch!='1' && ch!='2' && ch!='3');
串口读写 void Uart_putc(char c) { while(!SERIAL_WRITE_READY()); ((UTXH0) = (c)); } unsigned char Uart_getc( ) { while(!SERIAL_CHAR_READY()); return URXH0; }
设置Linux核心启动命令行 init程序在root中的位置 指定root在nfs服务器上 char *linux_cmd="noinitrd init=/init root=/dev/nfs nfsroot=172.16.68.25:/rootfs,tcp ip=172.16.68.24 console=ttySAC0"; 目标板IP地址 核心打印信息输出到串口0 主机IP地址及root目录
烧写bootloader • 在windows命令行下执行: • sjf2410-s.exe /f:bootloader.bin • 首先选择Flash类型,选0; • 其次选择jtag对flash的操作,选0,即写flash; • 接下来选择烧写的起始块号,选0; • 最后,烧写完毕后选择参数2,退出烧写;
试验 二 1、熟悉基本的linux命令 文件操作、文件编辑 串口工具、程序开发 2、配置linux核心 make menuconfig 3、交叉编译linux核心 make zImage
目标板 配置Linux核心; 编译Linux核心; 传送Linux核心影像到内存; … 启动Linux核心运行; Linux核心初始化包括串口、网卡 在内的基本设备; Linux核心加载nfs作为root; 基本的命令行操作; 编写一个小程序,察看运行结果。 数据 串口线 回显数据 主机
基本linux操作 • 1、目录相关 • cd、pwd、ls • 2、文件相关 • cp、mv、mkdir、chmod、cat • 3、程序开发相关 • Vi、find、grep、gcc、make • kscope、ddd、rapidsvn、gedit
常用串口工具 • 1、minicom • ttyS0 • 2、cutecom