DM646x的启动程序备份机制实现(一)

本文详细介绍了DM646x嵌入式系统中关键启动程序(ubl与uboot)的备份机制,包括ubl与uboot的引入原因、获取方法、写入方式、存储位置、实现备份功能的流程以及实际应用示例。

 


DM646x的启动程序备份机制实现

 

        由于现在嵌入式系统较多使用nand flash,而nand flash存在一定的数据损坏概率,所以需要实现关键启动程序的备份功能,以在nand flash出现了部分数据损坏的情况下,仍然能启动系统,继续运行,或者提供远程修复的基本功能。对于TI的davinci平台,一般启动过程如下:
       Rbl->[ubl->] uboot->kernel->rootfs->用户程序
注:nor flash上的启动,不需要ubl。
在Nand flash上的启动过程:
       首先运行芯片中的Rbl,然后运行nand flash上的ubl,再启动uboot,加载kernel,使用rootfs,运行
用户可执行程序。

       本文对启动部分的备份机制分2部分介绍:ubl与uboot,kernel与rootfs。

 


第一部分,ubl与uboot的备份

 

下面对ubl与uboot的备份方法进行研究,主要是回答了下面几个问题:

1,为何使用ubl?
2,如何获得ubl与uboot?
3,ubl与uboot是如何写入的?
4,ubl与uboot写在什么位置上?
5,由谁来实现备份使用功能?
6,具体如何实现备用功能?

 

1,为何使用ubl?
(1)由于nand flash不能实现字节读写功能,不能像内存那样随机访问,所以存
储在nand flash上的程序,需要复制到内存里,然后才能运行。
(2)芯片上电后,首先运行rbl。rbl是厂家固化在芯片里面的启动程序,做得相
当精简,只做最基本的操作,不支持ddr,所以此时只能使用片上内存。
(3)由于片上内存比较小,例如DM646x的为16k,而uboot往往都是100k以上,
不能存放到片上内存中。
(4)所以产生了ubl,在DM646x上是14k的,先由rbl搬移到片上内存,然后转移
cpu控制权给ubl,由ubl初始化ddr,后面就可以将整个uboot复制到ddr上,转到uboot中运行了。

 

2,如何获得ubl?
       http://sourceforge.net/projects/dvflashutils/files/DM646x/v1.50/
       下载下来是个压缩包:DM646x_FlashAndBootUtils_1_50.tar.gz ,这是个串口烧写工具,其中就带有ubl的源码,目录为:
Common\ubl与Common\sft。
       这里说明下,Common\ubl目录下的源码能生成最终写入nand的ubl.bin文件。
       但是Common\sft也是需要关注的部分,它是通过串口烧写时,串口下载到芯片片上内存部
分的程序,其功能基本与ubl是相同的作用,主要是进行ddr的初始化,以便于进行后续需要大内存的操作。简单说,就是要向nand写入多个ubl或者uboot,需要sft的支持。
       uboot源码,一般随开发板就带有,也可以在ti的网站上获得,或者在uboot的官网下
载。

 

3,ubl与uboot如何写入的?
       通常有两种方法:使用仿真器通过jtag口烧写,或者使用串口烧写工具通过串口烧
写。
       由于仿真器不是很容易获得的资源,下面我主要就串口方式进行说明:
上一步我们已经获得了串口烧写工具,在GNU目录下有个可执行程序sfh_DM646x.exe
,就是我们的串口烧写工具。将设备的串口与PC连接,在windows的命令行执行如下命令即可:
sfh_DM646x.exe -nanderase (擦除nand)
sfh_DM646x.exe -nandflash ubl_DM646x_nand.bin u-boot.bin (写入ubl与uboot

 

4,ubl与uboot写在什么位置上?
       通常,ubl是存放在nand flash的前几个块中,uboot存放在ubl之后。具体的使用
情况,在本部分的结尾有一个实例。

 

5,由谁来实现备份使用功能?
       备份的使用,是在默认启动程序有问题的时候,才启用的。而这个判断默认启动
程序是否有问题,是需要上一级的启动程序来进行判断的。
       例如,ubl的默认启动程序是否异常,需要rbl来判断,出了异常后,如何处理,是
否启用备用程序,也是由rbl来决定的。
       同样,uboot的备份是否使用,是依赖于ubl程序的。
       我们已经获得了ubl的源码,所以,可以修改源码以使其支持uboot的异常判断及
备份使用。这里,我们要当心的是rbl是否支持ubl备份的使用,很幸运,TI提供的DM646x的rbl提供了这个功能。

       好了,理论工作做完了,下面进入实际操作了。

 

6,具体如何实现备用功能?
       对于ubl与uboot的备份,分析起来步骤很多,其实最后要做的就只是一件事情:
修改sft程序,写入多个ubl与uboot。

       其实DM646x_FlashAndBootUtils_1_50 的sft中已经提供了多次写入的机制,只是有点问题,需要修改下代码。在sft源码中,在收到的一个文件后,进行了5次写入操作。但是只有第一次的写入是有效数据,然后指针就跑飞了,后面四次写的是未知数据。只需要修改指针,改为每次都写入有效数据即可。
       另外,是否都需要写5个备份,ubl与uboot是否需要备份的个数保持一样,答案都是否
定的。我们可以改代码,例如ubl写3个,uboot写2个,都是可以的。


 
 烧写之后的nand存储格局示例:
 
 第0个块 (0-128k)为空。

 第1个块 (20000存放块头)保存了ubl  ,20800--238ab
 第2个块 (40000存放块头),ubl
 第3个块 (60000存放块头),ubl
 第4个块 (80000),没有块头信息,存放uboot的参数。
 第5个块 (a0000存放块头),ubl

 第6-7个块  (C0000存放块头),   保存uboot,c0800--e261b
 第8-9个块  (100000存放块头),  保存uboot,100800--12261b
 第10-11个块 (140000存放块头),  保存uboot,140800--16261b
 第12-13个块 (180000存放块头),  保存uboot,180800--1a261b
 第14-15个块 (1c0000存放块头),  保存uboot,1C0800--1e261b

 第16个块  200000--352c1b 没有块头信息, 存放内核
 
说明:

       我使用的nand flash,一个块的大小为128k,一个ubl为14k,需要一个块来保存;一个uboot为136k,需要两个块来保存。

       使用串口烧写工具烧写的数据,前面都有一个头信息,存放在第一个页上面,所以真实的数据,例如uboot.bin的数据,都是从第二个页开始存储的。这些信息,可以通过uboot的nand read命令读出来查看。而内核没有这样占第一页的块头数据,这是由于解析程序没有这样的需求。内核的解析程序是uboot,uboot的解析方式与rbl、ubl不一样。

        第4个块,为何存放uboot的参数?在刚完成烧写ubl与boot时,第4个块是存放ubl的。uboot启动参数是在uboot环境下执行“saveenv”后写入的。当然,也可以修改uboot源码,将参数的存放位置转到其它地方。

 

### Selserver 启动失败的原因分析 Selserver 可能是指 SQL Server 的拼写错误。以下是可能导致 SQL Server 无法正常启动些常见原因及其对应的解决方案: #### 1. **SQL Server 配置问题** 如果 SQL Server 安装完成后尝试启动却失败,可能是由于配置不正确引起的。例如,服务账户权限不足或网络协议未启用等问题。 解决方案: - 确认 SQL Server 使用的服务账户具有足够的权限[^1]。 - 检查 SQL Server Configuration Manager 中的 TCP/IP 和 Named Pipes 是否已启用并设置为允许远程连接。 #### 2. **核心文件损坏** 在安装过程中,如果 `sqlservr.exe` 或其他关键组件被意外修改或删除,则可能会导致 SQL Server 服务无法启动。 解决方案: - 将安装目录中的 `sqlservr.exe` 文件备份至安全位置(如桌面),以便后续恢复使用。 - 若发现文件确实受损,可重新提取原始安装包中的干净版本替换现有文件。 #### 3. **依赖项缺失** SQL Server 运行时可能需要特定的支持库或框架支持(如 .NET Framework)。缺少这些必要条件也会阻止其成功初始化。 解决方法: - 根据官方文档确认当前操作系统是否满足最低系统要求,并安装任何所需的更新补丁或者额外软件环境。 #### 4. **日志记录异常** 查看 Windows 应用程序事件查看器 (`Event Viewer`) 下的相关错误消息可以帮助定位具体故障点;另外还可以查阅位于默认路径下的 ERRORLOG 文件获取更详细的诊断信息。 实现方式如下所示: ```powershell Get-Content 'C:\Program Files\Microsoft SQL Server\MSSQL.x\MSSQL\Log\ERRORLOG' | Select-String "Error" ``` #### 5. **资源冲突** 当多个实例在同台机器上竞争相同的端口或其他硬件资源时也可能引发崩溃现象。 处理措施建议包括但不限于更改监听地址/端口号来规避潜在干扰源影响。 --- ### 技术扩展——重试机制的应用价值 对于那些偶发性的外部因素所造成的短暂性中断情况而言,引入合理的自动重连逻辑显得尤为重要。比如在网络波动期间执行查询命令失败之后并非立刻放弃而是等待适当间隔后再做次尝试往往能够显著提升整体稳定性表现水平[^2]。 ```python import time def retry_operation(operation, retries=3, delay_seconds=5): attempt = 0 while attempt < retries: try: operation() break except Exception as e: print(f"Operation failed with {e}. Retrying...") time.sleep(delay_seconds) attempt += 1 else: raise RuntimeError("Maximum number of attempts reached.") ``` 上述脚本片段展示了如何构建个简单的函数用于封装任意待处理动作的同时赋予它有限次数内的自我修复能力。 --- ### 数据迁移注意事项 鉴于提到关于从 SQL Server 转移到 DAMENG (DM) 数据库的情境下需要注意诸多方面差异之处以免造成不必要的麻烦发生。这涉及到了诸如字段定义映射规则转换、索引重建策略制定等方面的工作内容[^4]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值