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

news2024/11/18 15:46:19

通过上面的分析,发现,其实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不会影响

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

#QT(DEMO)

1.IDE:QTCreator 2.实验:打印"hello wolrd" 3.记录 (1)创建一个新工程: 新建好一个工程存放文件夹(路径不能有中文),然后按下图配置 (2)点击widgets.ui拖入以…

活动报名|AutoMQ x 阿里云云原生创新论坛(2024.03.09)见证“新一代云原生 Kafka ”重磅发布!

新一年, AutoMQ 首场线下活动重磅来袭!2024年3月9日,由 AutoMQ 与阿里云联合举办的云原生创新论坛将于杭州与大家见面,双方联合重磅发布新一代云原生 Kafka ——AutoMQ On-Prem 版本 !现场将会分享如何通过云原生和存算…

美摄科技实时语音数字人解决方案

随着科技的飞速发展,数字人技术已经逐渐渗透到我们生活的各个角落。作为数字人技术的先驱者,美摄科技凭借其卓越的实时语音数字人解决方案,正引领着企业步入一个全新的交互时代。 美摄科技的实时语音数字人解决方案,是基于语音和…

【JavaEE进阶】 Linux常用命令

文章目录 🍃前言🌴ls 与 pwd🚩ls🚩pwd 🎍cd🚩认识Linux目录结构 🍀touch与cat🚩touch🚩cat 🌲mkdir与rm🚩mkdir🚩rm 🎄cp与…

UCSF DOCK 分子对接详细案例(04)-基于RDKit描述符的分子从头设计DOCK_D3N

欢迎浏览我的CSND博客! Blockbuater_drug …点击进入 文章目录 前言一、 软件及操作环境二、研究目的三、结构文件准备四、 DOCK/RDKit中 de novo design4.1 de novo design - refine_D3N4.2 对输出重新评分 总结参考资料 前言 本文是UCSF DOCK的使用案例分享&…

论文阅读:2017MobileNet V1谷歌轻量化卷积神经网络

拓展:贾扬清:深度学习框架caffe(Convolutional Architecture for Fast Feature Embedding) 主要贡献: 深度可分离卷积(Depthwise separable convolution)逐点卷积(Pointwise convo…

langchain学习笔记(九)

RunnableBranch: Dynamically route logic based on input | 🦜️🔗 Langchain 基于输入的动态路由逻辑,通过上一步的输出选择下一步操作,允许创建非确定性链。路由保证路由间的结构和连贯。 有以下两种方法执行路由 1、通过Ru…

dvwa靶场xss通关

原理 XSS漏洞是攻击者将恶意代码注入到合法网页中,当用户浏览该页面时,恶意代码会被执行,从而获取用户敏感信息或进行其他攻击。 形成原因 网站对用户输入数据的过滤不严格或不完备,攻击者可以根据这个漏洞向网站提交恶意代码&am…

白银投资可以买涨买跌吗?

在金融市场中,投资者总是在寻找机会以实现资产增值。白银作为一种贵金属和投资产品,历来被视作避险工具和保值手段。那么,白银投资能否买涨买跌?白银投资是可以通过伦敦银、白银期货、白银ETFs交易所交易基金等来进行买涨买跌操作…

甘特图资源视图和任务视图的区别

甘特图(Gantt chart)是一种常用的项目管理工具,用于直观地展示项目的进度和各项任务的时间安排。甘特图包含资源视图和任务视图两种视角。 一个项目的甘特图demo : https://zz-plan.com/share/87f1340286f1343ba5 资源视图主要显示项目中不同资源的分配和利用情况…

JAVA内存模型与JVM内存结构

注意区分Java内存模型(Java Memory Model,简称JMM)与Jvm内存结构,前者与多线程相关,后者与JVM内部存储相关。本文会对两者进行简单介绍。 一、JAVA内存模型(JMM) 1. 概念 说来话长,由于在不同硬件厂商和…

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

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

JS正则03——js正则的贪婪匹配模式与非贪婪匹配模式➕正向预测匹配和负向预测匹配的详细使用及例子

JS正则03——js正则的贪婪匹配模式与非贪婪匹配模式➕正向预测匹配和负向预测匹配的详细使用及例子 1. 前言1.1 js正则的基本使用 2. 贪婪匹配模式 与 非贪婪匹配模式2.1 引例2.2 贪婪模式2.3 非贪婪模式2.4 原理——参考 3. 预测匹配方式3.1 正向预测匹配3.2 负向预测匹配3.2.…

试手一下CameraX(APP)

书接上回。 首先还是看谷歌的官方文档: https://developer.android.com/media/camera/camerax?hlzh-cn https://developer.android.com/codelabs/camerax-getting-started?hlzh-cn#1 注:这里大部分内容也来自谷歌文档。 官方文档用的是Kotlin&…

Window下编写的sh文件在Linux/Docker中无法使用

Window下编写的sh文件在Linux/Docker中无法使用 一、sh文件目的1.1 初始状态1.2 目的 二、过程与异常2.1 首先获取标准ubuntu20.04 - 正常2.2 启动ubuntu20.04容器 - 正常2.3 执行windows下写的preInstall文件 - 报错 三、检查和处理3.1 评估异常3.2 处理异常3.3 调整后运行测试…

不知道RAID/SAN/NAS的小可爱来看看这个吧!

RAID RAID(冗余阵列的独立磁盘,Redundant Array of Independent Disks)是一种将多个磁盘驱动器组合成一个或多个单元的技术,目的是在提高数据可靠性和/或提升性能的同时,对操作系统隐藏底层的复杂性。简而言之&#x…

Vue3中Vuex状态管理库学习笔记

1.什么是状态管理 在开发中,我们会的应用程序需要处理各种各样的数据,这些数据需要保存在我们应用程序的某个位置,对于这些数据的管理我们就称之为状态管理。 在之前我们如何管理自己的状态呢? 在Vue开发中,我们使用…

“比特币暴拉冲破6.5万美元”!超罕见指标揭示牛市信号,18万美元目标能否实现?

比特币(BTC)周末持续在6.2万美元反复震荡之后,今(4)晨再次强势拉涨,早上8:45左右最高触及64268美元,随后插针盘整,下午5点30分左右突破65500美元,再创今年新高…

第七届电路,系统与仿真国际会议(ICCSS 2024)即将召开!

2024年第七届电路,系统与仿真国际会议(ICCSS 2024)将于5月17-19日马来西亚博特拉大学举办。本届会议由马来西亚博特拉大学和中国东南大学协办,电机与电子工程系主办。ICCSS 2024 热烈欢迎所有来自电路、系统和仿真等相关领域的研究…

Java基于springboot的课程作业管理系统

摘 要 随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,课程作业管理系统当然也不能排除在外。课程作业管理系统是以实际运用为开发背景,运用软件工程原理和开发方法…