115.龙芯2k1000-pmon(14)- pmon编程优化

通过上面的分析,发现,其实gzrom-dtb.bin其实有很多空白区域,而且空白区域填充的都是0,这对flash来说并不友好,能否把填充的位置改为ff呢,这样编程的速度也会加快,对flash来说也是一种保护呢。

说干就干:

python脚本改好了:(可能有bug)

"""
python pmonenv.py -f gzrom.bin -o 0x70000 -s 512 al=/dev/mtd0 append="'root=/dev/mtdblock0'"
python ../tools/pmonenv.py -f gzrom-dtb.bin -d ls2k.dtb -w  al=/dev/ram@p0x110000000 al1=/dev/ram@p0x110000000 append="'console=ttyS0,115200 initcall_debug=1 loglevel=20 nosmp'" FR=1
"""
import struct
import sys
import getopt
import os

def readenv(fname,foff,fsz,argv):
	f=open(fname,'rb+')  
	f.seek(foff,0) 
	a=f.read(fsz) 
	# print("1 a read = ",a)   # 1
	# print("a.len = ",len(a))   # 2 
	a=a.ljust(fsz,b'\x00')    
	f.close()   
	d={}
	b = struct.unpack('!'+str(len(a)//2)+'H',a)  
	# print("3 b = ",b)  # 3
	# print("b.len = ",len(b))   # 4
	if(sum(b)&0xffff):  
		print('checksum error, rebuild env')
		t = argv
	else:
		e = a[2:].find(b'\x00\x00')  
		# print("4 e = ",e)    # 5
		t = a[2:2+e].split(b'\x00')+list(map(lambda x:x.encode('utf8'),argv))   
		# print("5 t = ",t)   # 6
	# print("\n for start*******************")
	for i in t:
		a=i.split(b'=',1)  
		# print("6 a = ",a)   # 7
		if len(a) > 1:     
			d[a[0]] = a[1]   
		elif a[0] in d:   
			del d[a[0]]
	# print("for end*******************\n")
	return d

def writeenv(fname,foff,fsz,d):
	# print("\nwriteenv start*******************")
	# print("7 d = ",d)   # 8
	a=b'\x00\x00'   
	for i in d.keys():   
		a += i+b'='+d[i]+b'\x00' 
		# print("8 a = ",a)   # 9
	a=a.ljust(fsz,b'\xff')    # full ff
	b = struct.pack('!H',(-sum(struct.unpack('!'+str(len(a)//2)+'H',a)))&0xffff)
	# print("9 b = ",b)   # 10
	a=b+a[2:]
	# print("10 a = ",a)   # 11
	f=open(fname,'rb+')

	size=os.path.getsize(fname)
	print("size=",size)
	c = ""
	c=c.ljust(foff-size-0x4000,'\xff') # full ff
	f.seek(size, 0) # full ff
	f.write(c)

	f.seek(foff,0)
	f.write(a)  
	f.close()

def writehexenv(fname,hexbin):
	f=open(fname,'rb+')
	f.seek(foff+fsz, 0)
	f.write('\xff'*256)
	for b in hexbin.split(','):
		i,v = b.split(':')
		f.seek(foff+int(i,0),0)
		f.write(v.decode('hex'))
	f.close()

def writedtb(fname,dtb,foff):
	# print("\n writedtb start----------------------")
	f=open(dtb,'rb')
	a=f.read();
	# print("a.len= ",len(a))  # 12
	f.close()
	a=a.ljust(0x4000-8,'\xff')
	# print("a = ",a)
	b = struct.pack('I',(-sum(struct.unpack(''+str(len(a)//4)+'I',a)))&0xffffffff)
	a=b+a+b
	# print("a.len= ",len(a))  # 13
	# print("a = ",a)

	f=open(fname,'rb+')
	f.seek(foff-0x4000,0)
	f.write(a)
	f.close()
    
if __name__ == '__main__':
	opt,argv=getopt.getopt(sys.argv[1:],'b:o:s:f:wd:')
	opt=dict(opt)
	foff = int(opt['-o'],0) if '-o' in opt  else 0x000ff000  
	fsz = int(opt['-s'],0) if '-s' in opt else 500  
	fname = opt['-f'] if '-f' in opt else 'gzrom.bin' 
    
	print(foff)
	print(fsz)
	print(fname)

	d=readenv(fname,foff,fsz,argv)
	print(d) 
	if '-w' in opt:  
		writeenv(fname,foff,fsz,d)   
		if '-b' in opt: writehexenv(fname, opt['-b'])
		if '-d' in opt: writedtb(fname, opt['-d'], foff)
           

生成的bin文件中,空白区域为ff了:

更新试试,能否启动?

启动成功!!!填充ff不会影响

但是说实话,感觉烧写的速度并没有明显提高,我没有计时

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/428039.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【网站项目】121开放式教学评价管理系统

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

Linux速览(1)——基础指令篇

在上一章对Linux有了一些基础了解之后,本章我们来学习一下Linux系统下一些基本操作的常用的基础指令。 目录 1. ls 指令 2. pwd&&whoami命令 3. cd 指令 4. touch指令 5.mkdir指令(重要): 6.rmdir指令 && …

【虚拟机安装centos7后找不到网卡问题】

最近开始学习linux,看着传智播客的教学视频学习,里面老师用的是centos6.5,我这边装的是centos7最新版的 结果到了网络配置的这一节,卡了我好久。 我在centos一直找不到我的网卡eth0,只有一个回环网口,在/…

TikTok外贸系统的核心功能及其源代码分享!

随着全球化的不断推进,外贸业务成为越来越多企业的增长动力,TikTok作为一个全球性的社交媒体平台,其用户基数庞大、活跃度高,为外贸业务提供了无限的商机。 为了帮助企业在TikTok上更好地开展外贸业务,TikTok外贸系统…

Ubuntu环境使用docker构建并运行SpringBoot镜像

今天Ubuntu环境使用docker构建并运行SpringBoot镜像,看文章之前建议先查看安装流程: Linux环境之Ubuntu安装Docker流程 一、镜像打包过程及执行 1、创建一个测试目录 mkdir javaDemo 2、springBoot的包复制到此目录下 cp demo1-0.0.1-SNAPSHOT.jar /data/app/…

Docker快速集成minio

拉取镜像(默认最新的) docker pull minio/minio创建配制和数据映射文件夹(用于将容器内的配置和数据映射到本地) 这边的路径可以修改成自己想要的文件夹 mkdir -p /data/minio/{config,data}启动容器 (这边启动容器要保证本地映…

【大厂AI课学习笔记NO.61】环境部署的选择

主要是选择单机和分布式、生产和开发环境的规划等。 开发环境、测试环境、预发布环境和生产环境是软件开发和部署过程中常见的几个环境,它们各自的定义、区别、联系以及实现的关键技术如下: 1. 开发环境(Development Environment&#xff09…

骨传导耳机哪个牌子好?六大选购窍门,帮你甩掉坑货!

很多用户对骨传导耳机的理解存在偏差,认为只要选择价格贵的、热度高的产品就能万事大吉,而实际却不是如此,要知道,随着骨传导耳机逐渐成为热门款式,目前的市场上的骨传导耳机品牌也变得五花八门,这其中就包…

Android MediaCodec 简明教程(五):使用 MediaCodec 编码 ByteBuffer 数据,并保存为 MP4 文件

系列文章目录 Android MediaCodec 简明教程(一):使用 MediaCodecList 查询 Codec 信息,并创建 MediaCodec 编解码器Android MediaCodec 简明教程(二):使用 MediaCodecInfo.CodecCapabilities 查…

刷题日记:面试经典 150 题 DAY3

刷题日记:面试经典 150 题 DAY3 274. H 指数238. 除自身以外数组的乘积380. O(1) 时间插入、删除和获取随机元素134. 加油站135. 分发糖果 274. H 指数 原题链接 274. H 指数 重要的是都明白H指数到底是是个啥。注意到如果将引用数从大到小排序,则对于…

每日一题-移除链表元素

🌈个人主页: 会编辑的果子君 💫个人格言:“成为自己未来的主人~” 移除链表元素 以上是题目名称: typedef struct ListNode SListNode; struct ListNode* removeElements(struct ListNode* head, int val) {SListNode*newHead,*newTail;ne…

Matlab 机器人工具箱 例程:运动学+动力学+路径规划+可视化

文章目录 1 创建机器人2 机器人显示3 机器人示教4 机器人路径规划:给定关节角路径5 机器人路径规划:给定末端位姿,求关节角路径6 工作空间可视化参考链接 1 创建机器人 clc;clear;close all; deg pi/180;L1 Revolute(d, 0, a, 0, alpha, 0,…

分账系统哪个好 盘点2024年好用的四款分账系统

分账系统在现代商业活动中扮演着至关重要的角色,为企业提供了高效、准确的分账管理。那么,你知道2024年哪几款分账系统最好用呢?跟着小编的脚步去看看吧! 一、商淘云 商淘云是广州商淘信息科技有限公司旗下品牌,它提…

CBA全明星急需改革但先不谈!不如先学学如何尊重球迷

直播吧指定地址:www.bjcenn.com 3月4日讯 昨晚CBA全明星正赛,南区明星队138-122击败北区明星队。 媒体人三土带刺更博长文总结了本次全明星,原文如下: 如何总结这次全明星? 又一届CBA全明星周末结束,关…

OSPF多进程

路由器——>选路——>参考路由表 路由表的生成: 直连路由直接加入 静态路由 动态路由,ospf:选择最优加入 IGP高级特性---OSPF多进程防火墙虚拟系统引流 http://t.csdnimg.cn/mTU3nhttp://t.csdnimg.cn/mTU3n 华为文档地址&#…

骨传导耳机哪个牌子好?简单6招教你选到高品质机型!

作为一名有着十几年工作经验的资深数码产品测评师,多年来见过太多因为选购劣质骨传导耳机而踩雷的情况,对此,我想要提醒大家的是,在选择骨传导耳机时不要一味地追求外观颜值、品牌知名度,而应该更加重视产品的专业技术…

刷题日记:面试经典 150 题 DAY4

刷题日记:面试经典 150 题 DAY4 42.接雨水13.罗马数字转整数12.整数转罗马数字58.最后一个单词长度14.最长公共前缀 42.接雨水 原题链接 42.接雨水 在学校的算法小学期做过,做法是基于一个重要的观察: 一列列的看,当前列雨水的高…

一线大厂软件测试面试题及答案解析,2024最强版...

【软件测试面试突击班】2024吃透软件测试面试最全八股文攻略教程,一周学完让你面试通过率提高90%!(自动化测试) 1、什么是兼容性测试?兼容性测试侧重哪些方面? 参考答案: 兼容测试主要是检查软件在不同的硬件平台、软件平台上…

Java多线程——如何控制线程顺序执行,如何控制线程同时执行

目录 引出如何控制线程执行顺序?多个线程在某一时刻同时开始执行? Redis冲冲冲——缓存三兄弟:缓存击穿、穿透、雪崩缓存击穿缓存穿透缓存雪崩 总结 引出 Java多线程——如何控制线程顺序执行,如何控制线程同时执行 如何控制线程…

leetcode日记(36)全排列

想思路想了很久……思路对了应该会很好做。 我的思路是这样的&#xff1a;只变化前n个数字&#xff0c;不断增加n&#xff0c;由2到nums.size()&#xff0c;使用递归直到得到所有结果 代码如下&#xff1a; class Solution { public:vector<vector<int>> permut…