本文主要是介绍自己写bootloader --出现system halted问题解决,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1.bootloader功能:
分为2个阶段。第一阶段是初始化硬件相关的一些配置,如时钟初始化,关闭看门狗,设置栈,初始化SDRAM,链接脚本配置。第二阶段是从Nand Flash 或 Nor Flash 读出内核,设置启动参数,跳到加载地址启动内核(需要实现Nand 和Nor的初始化操作和读写功能)。
2.遇到的问题:
把自己写的bootloader烧到nor(内核已经烧在nand上了)上电执行时出现
出现这个问题的原因是nand中有坏块
void nand_read(unsigned int addr, unsigned char *buf,unsigned int len)
{int col = addr %2048;int i = 0;while(i < len){/* 1.选中 */nand_select();/* 2.发出读命令00h */nand_cmd(0x00);/* 3.发出地址 (分5步发出) */nand_addr(addr);/* 4.发出读命令30h */nand_cmd(0x30);/* 5.等待就绪,判断状态 */nand_wait_ready();/* 6.读数据 */for(; (col < 2048) && (i < len); col++){buf[i] = nand_data();i++;addr++;}col = 0;/* 7.取消选中 */nand_deselect();}}
加入读坏块的判断之后成功读出内核
void nand_read(unsigned int addr, unsigned char *buf,unsigned int len)
{int col = addr %2048;int i = 0;while(i < len){ if (!(addr & 0x1FFFF) && nand_bad(addr)) /* 一个block只判断一次 */{addr += (128*1024); /* 跳过当前block */continue;}/* 1.选中 */nand_select();/* 2.发出读命令00h */nand_cmd(0x00);/* 3.发出地址 (分5步发出) */nand_addr(addr);/* 4.发出读命令30h */nand_cmd(0x30);/* 5.等待就绪,判断状态 */nand_wait_ready();/* 6.读数据 */for(; (col < 2048) && (i < len); col++){buf[i] = nand_data();i++;addr++;}col = 0;/* 7.取消选中 */nand_deselect();}
}
这篇关于自己写bootloader --出现system halted问题解决的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!