忽略这一点,人工智能变人工智障的!

《Hello World》谈AI决策利弊与应用
本文围绕人工智能决策展开,介绍《Hello World》作者对数据驱动决策的利弊分析。探讨了算法系统引入、法庭使用算法、人类技能退化等问题,还讲述了司法领域算法应用,如Burgess预测工具及现代随机森林算法,其在多领域有帮助。

640?wx_fmt=gif

【优快云 编者按】当今社会,人工智能已进入我们生活的方方面面,很多人会担心算法的控制权过多,也有人担心数据有偏差的话,输出也会有偏差。对此,《Hello World》的作者介绍该如何采用数据驱动的决策,并提供了清晰的利弊分析。

640?wx_fmt=jpeg

作者 | The Economist

译者 | 弯月

责编 | 伍杏玲

出品 | 优快云(ID:优快云news)

以下为译文:

如今,人工智能已经深入生活的方方面面,我们的社会更加依赖于算法做决策,而不是人。这些系统已经在银行、电子商务、医疗保健以及治安等领域显现出了强大的潜力。

然而,人们越来越担心算法的控制权过多,尤其是当人们将决定权交给机器的时候,例如自动驾驶汽车或法庭判决等场合。如果因此而阻碍人工智能的使用,那么社会和经济就有可能无法享受人工智能带来的各种潜在优势。

Hannah Fry是伦敦大学学院高级空间分析中心的数学家,多年来她一直在研究这些系统。不过人们对她的更多了解来自BBC的公开讲座和纪录片,她是一名数学和科学领域的知名人士。

在她最新的著作《Hello World》一书中,Fry女士揭开了这种技术的神秘面纱,她通过回顾历史向我们解释了如何采用数据驱动的决策,并提供了清晰的利弊分析。使用人工智能的好处在于,AI可以更快更准确地执行任务,而缺点是如果数据有偏差,那么输出可能有偏差。

The Economist针对社会应当如何利用这项技术,对Fry女士进行了采访。在本文中,首先我们会详细报道此次采访的内容,而后面的部分是《Hello World》一书中有关刑事司法系统和“随机森林”算法的节选。

 

640?wx_fmt=png

自动化会失误,人类才是考虑的核心

 

The Economist:所有的数据都有偏差,那么我们是否应该推迟算法系统的引入,直到我们确信我们已经发现并解决了算法系统中的关键性问题,还是说我们应该降低标准:“尽最大努力”来发现和修正偏差,同时在发现漏洞的时候,可以随时发布代码和补丁?

Hannah Fry:大家在这个问题上很容易产生一种误解。当看到算法会引发别的问题时,我们就想着完全抛弃这些算法,并认为我们应该坚持依赖人类的决策来解决问题,直到更好的算法出现。然而,实际上人类也存在偏见,而且还会受到各种问题的迷惑。

其实,这完全取决于你需要的精准度。例如,你可以在足球比赛中引入“视频助理裁判”,但你不能不负责任地以相同的方式在医疗保健领域引入一个有问题的系统。总的来说,总体目标必须是建立最公平、最统一的系统。这意味你必须承认完美是不可能的,而且权衡利弊也在所难免。然而,同时也意味着我们应该设法鼓励利用算法做决策,尽管它们也难免会出错。

The Economist:刑事司法系统有时会吹嘘“与其让一个无辜的人入狱,不如释放一个罪犯”的价值观。我们是否应该拒绝在法庭上采用算法来做出严肃的决定(即宣判),因为我们永远也不确定这是否是盲目的正义?

Hannah Fry:每个刑事司法系统都必须在保护无辜的人被诬告和保护犯罪受害者之间找到某种平衡。实现这种平衡并非易事,而且司法系统也并非完美——而且也从未尝试做到完美。这就是为什么“合理地怀疑”和“充分的理由”之类的词汇是基本的法律用语:这类的系统必须接受绝对的确定性是无法实现的。

然而,即使在这些约束之下,法官的决定里面仍然可能有前后矛盾和运气的成分。人们无法保证做出公平和一致的决策。而法官与我们其他人一样,有时也无法放下潜在的偏见。

如果你谨慎地对待这些问题,那么我认为我们有可能通过使用算法来支持法官的决定,从而将这类问题降到最少。你必须确保以一种更公平地方式使用系统,还要确保不会意外地加剧已经存在的偏差。

The Economist:你是否担心最终人类会把生活中重要的权利交给机器,就像我们已经由于电子地图的出现而丧失了方向感?

Hannah Fry:我认为,随着自动化的发展,我们的确会失去一些技能。例如,现在我连自己的电话号码都记不住,更不用说我以前知道的那一长串电话号码了,而且我的书法也一落千丈。但我并不觉得自己非常担心这方面的问题。

历史上我们也曾经历过担心技能退化的问题。飞行员就曾有过这样的经历:自动驾驶越好,初级飞行员手动控制飞机的技术就越差。以前在手术室里,初级外科医生可以通过在开放式手术中协助咨询顾问的方式(他们的手会接触患者,触摸和感觉身体)进行训练,而如今他们可以观看咨询顾问坐在控制台操作的微创手术,而且还有内部的摄像机在屏幕上放映。

如果有一天我们真的进入无人驾驶汽车普及的阶段,而我们却不认真考虑如何保持我们的驾驶技术的话,那么人们在没有辅助的情况下的驾驶能力会下降,我们仍然希望我们能够人为介入,并在紧急情况下采取行动控制汽车。

为了避免这个问题,你可以采取一系列措施,例如时不时地故意关闭机器。但我认为,我们应该承认自动化有时也会出现失误,而且我们应该确保人类(以及他们的需求和失误)始终应该是我们考虑的核心。

The Economist:当算法进入医学、法律和其他领域时,算法得出的决定只能作为“建议”,人类在这个过程中仍然有最终的决定权。然而,根据行为心理学的大多数研究表明这只是一种假象:算法对人类有着非凡的影响。我们怎样才能从现实的角度克服这个问题呢?

Hannah Fry:通常人们都很懒惰。我们喜欢采用简单的方法,我们喜欢推卸责任,我们喜欢走捷径,如此一来我们就不必思考了。

如果你设计的算法可以告诉你答案,而你却希望人们会再三检查这个答案,提出质疑,并且还知道在适当的时候提出别的答案,那么实际上你在自掘坟墓。人类本身就不擅长做这种事情。

但是,如果你设计的算法能够坦然地承认它们的不确定性——公开和坦诚地向你的用户说明它们做决定的过程,以及在这个过程中经历的所有混乱和模糊,那么我们就知道什么时候我们应该相信自己的直觉。

我认为这是IBM的沃森最好的一个功能,它参加了美国的智力竞赛节目《危险边缘》(Jeopardy)!而且还获胜了。虽然该节目要求选择一个答案,但该算法在此过程中还考虑了替代方案,并表明了每种方案的正确概率。

这也是最新的卫星导航的好处:它们并不会为你决定路线,而是会给你三个选择,并告诉你利弊。你可以通过这些信息做出明智的决定,而不是盲目地交出控制权。

The Economist:有什么事情是人类能做,机器却做不了的吗?为了帮助人类在算法时代依然蓬勃发展,我们的社会需要做出哪些改变?

Hannah Fry:人类可以比机器更好地理解背景和细微的差别。我们的适应性更强。如果你把我们带到一个全新的环境下,我们知道如何表现,这是最优秀的人工智能也望尘莫及的。

除此之外,这是一个人类的世界,而不是算法的世界。因此,人类始终应该居于新技术思想的前沿和中心。

这话看似显而易见,然而实际情况却并非如此。最近的趋势有意将新算法迅速推向世界,并通过现实世界中的真实用户进行现场实验,而不是停下来思考这些算法是否弊大于利,或发现它们有问题后推迟采用这些算法。(我说的就是你:社交媒体。)

我认为社会需要坚定立场:有些新技术(例如新药)需要谨慎使用并提前考虑最坏的情况。我认为我们构建的算法应该诚实地表明它们的弱点,并坦诚地说明完美往往都是不可能的。但最重要的是,我认为我们构建的算法应该接受人类的失误,而不是视而不见。

 

640?wx_fmt=png

面向司法的数学式

 

节选自Hannah Fry的著作《Hello World:How to be Human in the Age of the Machine Book》(出版社:Doubleday,出版日期:2018年)

算法不能决定某人是否有罪。

它们无法衡量辩护方和起诉方的辩论,分析证据,或决定被告是否真的有悔意。所以我们不能指望算法在近期内取代法官。然而,算法也有意想不到的用处,比如使用个人的数据来计算他们今后再次犯罪的概率。而且,由于许多法官也会根据罪犯是否会再次犯罪的概率来判决,因此这种算法非常实用。

司法系统使用数据和算法已有将近一个世纪的历史了,第一次的使用可以追溯到20世纪20年代美国的一宗案子。当时,根据美国的制度,被定罪的罪犯将被判处最高刑期,然后在一段时间过后才有资格获得假释。数万名囚犯依据此律获准提前释放。有些人重获自由,而有些人则没有。

但总的来说,他们的案例为自然实验提供了完美的环境:你能否预测罪犯会违反他们的假释条款吗?

芝加哥大学的加拿大社会学家Ernest W. Burgess对预测充满了兴趣。Burgess是量化社会现象的重要支持者。在他的职业生涯中,他一直在尝试预测退休和婚姻成功产生的影响。1928年,他成功地建立了第一个预测工具,这个工具可以根据测量的结果(而不是直觉)预测犯人再次犯罪的概率。

Burgess利用美国伊利诺伊州三所监狱中三千名囚犯的各种数据,找出了他认为对于决定某人是否会违反他们的假释条款“可能有着重大影响”的21个因素。其中包括犯罪的类型、在监狱中服刑的月份和囚犯的社会类型——他根据二十世纪早期社会科学家所关注的话题对罪犯进行了分类:流浪汉、酒鬼、窝囊废、乡巴佬和移民。

Burgess从这21个因素出发为每个犯人打分(0或1)。获得高分(16-21分)的人再次犯罪的概率最低,而那些得分很低(4分以下)的人则极有可能违反他们的假释条款。

等到最终所有囚犯都被释放后,有些人违反了假释条款,于是Burgess抓紧这次机会检验他的预测结果。通过一个基本的分析,他发现自己预测非常准确。在他的低风险人群中有98%通过了他们的假释,而他认定的高危人群中有三分之二没有通过假释。事实证明,即使是粗略的统计模型也可以比专家做出更好的预测。

但Burgess的工作也受到了批评。

持怀疑态度的旁观者质疑,从一个地方得出的预测假释成功的因素中有多少能够适用于其他地方。(他们其中的一个观点是:在预测现代化大城市内犯罪分子再次犯罪的概率时,如何确保“乡巴佬”会有很大的帮助。)

其他学者还指出Burgess只利用了现有的信息,而没有调查其中的相关性。关于对他对囚犯进行评分的方式也存在疑问:毕竟,他的方法只不过是根据方程式算出来的。尽管如此,这种预测能力也足以让人震撼,1935年美国伊利诺伊州的监狱开始借助Burgess的方法支持假释委员会做出决定。等到了世纪之交,由Burgess的方法衍生出来的其他数学方法在全世界范围内得到了应用。

再来看看现代,目前法庭使用的最先进的风险评估算法远比Burgess设计的基本工具复杂得多。这些算法不仅可以协助假释决定,而且还可以帮忙为囚犯指定干预方案,决定谁应该获得保释,最近还开始支持法官做出判刑决定。这些算法的基本原则与以往一样:了解被告的情况(年龄、犯罪历史、犯罪的严重性等等),并预测让他们获得保释的危险程度。

那么,这些算法的工作原理是什么呢?从广义上讲,表现最优秀的现代算法采用了一种名叫随机森林的技术,其核心的概念非常简单,就是简单的决策树。

 

640?wx_fmt=png

征询观众的意见

 

你可能在学生时期就听说过决策树。

数学老师很喜欢决策树,他们把决策树当成一种组织观察的方式,例如抛硬币或掷骰子。在构建完成后,你可以把决策树当成一种流程图:根据一系列的要素,逐步评估下一步该做什么,或者判断当前情况下的事态发展。

想象一下,你正在决定是否批准某人的保释。与假释一样,这个决定的根本只是一个简单的计算。有罪与否并不要紧。你只需要做出预测:被告是否会被判入狱,是否会违反保释协议的条款?

为了帮助你做出预测,你可以参考一些之前的罪犯数据,有些人在保释期间逃跑,或再次犯罪,而有些人却没有。

你可以利用这些数据,手工构建一个简单的决策树,如下图所示,利用每个罪犯的特征来构建流程图。构建完成后,你就可以利用决策树预测罪犯的行为方式。你只需要根据犯罪者的特征沿着相关的分支前进,直到得出预测结果。只要这些结果符合之前所有人的模式,预测就是正确的。

640?wx_fmt=jpeg

然而,我们在学校制作的这种决策树也会出现失误。当然,并非每个人都和之前的模式一模一样。而且决策树本身也会产生很多错误的预测。而且不仅仅是因为我们的这个例子非常简单,即使你拥有大量之前的案例数据集,并建立极其复杂的流程图,偏差也再所难免,最后的结果我们也只能说使用一棵决策树总比随便乱猜稍好一些。

然而,如果你构建了不止一棵树,那么一切都有可能改变。这一次我们不会一次性用光所有数据,而是采用分而治之的方法。

在所谓的集合中,首先我们根据数据的随机子集构建数千棵小树。然后,当有新的被告时,你只需让每棵树投票决定是否应该批准保释。树木之间可能并不完全一致,而且每棵树依旧可能做出不准的预测,但你只需要取所有答案的平均值,就可以大大提高预测的精确度。

这有点像在“谁想成为百万富翁”的节目中征询观众的意见。虽然房间里面都是陌生人,但是他们加在一起比最聪明的人更有可能得出准确的答案。(“征询观众的意见”的成功率为91%,相比之下,“打电话向朋友求助”的成功率仅为65%。)

许多人所犯的错误可能相互抵消,所以一群人总是比一个人更聪明。

同样的道理也适用于一大群决策树,它们组成一个随机森林。因为这种算法的预测是基于它从数据中学习的模式,所以随机森林又被称作机器学习算法,这种算法在人工智能领域的应用非常广泛。(值得一提的是,该算法本质上就是你在上学时绘制的流程图,只不过经过了一些数学操作,这听起来是不是很伟大?)

事实证明,随机森林在整个现实世界的应用程序中非常有帮助性。Netflix通过随机森林,根据你过去的喜好,预测你想要观看的内容; Airbnb可以检测欺诈账户;而医疗界用随机森林来诊断疾病。

在评估犯罪分子时,与人类评估相比,随机森林拥有两大优势。首先,该算法可以针对相同的案例给出完全相同的答案。保证一致性的同时也不牺牲个人的司法公正。还有一个关键的优势:这种算法可以得出更好的预测结果。

链接:https://medium.com/@the_economist/algorithms-should-take-into-account-not-ignore-human-failings-40049ae7bc7b

三分钟看懂什么是人工智能?

https://edu.youkuaiyun.com/topic/ai30?utm_source=csdn_bw

 

【END】

640?wx_fmt=jpeg

作为码一代,想教码二代却无从下手:

听说少儿编程很火,可它有哪些好处呢?

孩子多大开始学习比较好呢?又该如何学习呢?

最新的编程教育政策又有哪些呢?

下面给大家介绍优快云新成员:极客宝宝(ID:geek_baby)

戳他了解更多↓↓↓

640?wx_fmt=jpeg

 热 文 推 荐 

ARM 发布新一代 CPU 和 GPU,实现 20% 性能提升!

国产芯片失落的十年

如何打造工业物联网帝国?

比特币冲到9000美元, 你就能找个好工作?

☞1000 万个“AI 名师”:用机器算法“解剖”应试教育

阿里面试,我挂在了第四轮……

☞10个爬虫工程师必备的工具了解一下

为什么说深耕AI领域绕不开知识图谱?

如何快速深入理解监控知识? | 技术干货

☞大神!这段代码让程序员躺赚200W,源码简单,你怎么看?

640?wx_fmt=gif点击阅读原文,输入关键词,即可搜索您想要的 优快云 文章。

640?wx_fmt=png你点的每个“在看”,我都认真当成了喜欢

【四轴飞行器】非线性三自由度四轴飞行器模拟器研究(Matlab代码实现)内容概要:本文围绕非线性三自由度四轴飞行器模拟器的研究展开,重点介绍了基于Matlab的建模与仿真方法。通过对四轴飞行器的动力学特性进行分析,构建了非线性状态空间模型,并实现了姿态与位置的动态模拟。研究涵盖了飞行器运动方程的建立、控制系统设计及数值仿真验证等环节,突出非线性系统的精确建模与仿真优势,有助于深入理解飞行器在复杂工况下的行为特征。此外,文中还提到了多种配套技术如PID控制、状态估计与路径规划等,展示了Matlab在航空航天仿真中的综合应用能力。; 适合人群:具备一定自动控制理论基础和Matlab编程能力的高校学生、科研人员及从事无人机系统开发的工程技术人员,尤其适合研究生及以上层次的研究者。; 使用场景及目标:①用于四轴飞行器控制系统的设计与验证,支持算法快速原型开发;②作为教学工具帮助理解非线性动力学系统建模与仿真过程;③支撑科研项目中对飞行器姿态控制、轨迹跟踪等问题的深入研究; 阅读建议:建议读者结合文中提供的Matlab代码进行实践操作,重点关注动力学建模与控制模块的实现细节,同时可延伸学习文档中提及的PID控制、状态估计等相关技术内容,以全面提升系统仿真与分析能力。
<think>我们之前讨论的是关于分散加载文件(scatter file)的配置,特别是针对LR_IROM1区域的配置,用户希望得到一个切实可行且不需要手动复制的方案。根据引用内容,我们可以总结出以下关键点: 1. 分散加载文件用于指定代码和数据的加载域(Load Region)和执行域(Execution Region)。 2. 在引用[1]和[2]中,展示了如何将特定段(如RESET、InRoot$$Sections)和任意代码段(.ANY (+RO))分配到指定的地址。 3. 引用[3]说明了如何修改分散加载文件,特别是通过Keil IDE编辑.sct文件。 4. 引用[4]提到一个常见错误:LR_IROM1区域大小超出限制,并给出了解决方法(调整区域大小)。 用户的需求是:针对提供的分散加载配置(LR_IROM1 0x00000000 0x00010000)给出一个切实可行的方案,且不需要手动复制(可能是指不需要在代码中手动复制函数到RAM中执行,或者是指分散加载文件的配置能够自动处理,不需要人工干预)。 根据引用内容,我们可以设计如下方案: ### 方案:自动分配函数到特定内存区域(无需手动复制) 在分散加载文件中,我们可以定义特定的执行区域,并通过段名将函数自动分配到这些区域。这样,在链接时,链接器会自动将指定的函数放到我们定义的内存区域,无需在代码中手动复制。 例如,用户希望将某些函数(如需要快速执行的函数)放到RAM中执行,通常的做法是在启动时将这些函数从Flash复制到RAM。但是,通过分散加载文件的配置,我们可以让链接器自动生成复制代码(由__main函数在启动时自动执行),从而避免手动复制。 #### 具体配置步骤: 1. **定义加载域和执行域**: 在分散加载文件中,为需要复制到RAM中执行的函数定义一个加载域(Load Region)和一个执行域(Execution Region)。加载域指定这些函数在Flash中的存储位置,执行域指定它们在RAM中的运行位置。 2. **使用段名标记函数**: 在C代码中,通过`__attribute__`将需要复制到RAM的函数放入一个自定义段(例如:`RAM_FUNC`)。 3. **在分散加载文件中引用该段**: 在加载域中,将该段的内容分配到Flash的某个位置(例如:在LR_IROM1中预留一块空间用于存储这些函数的二进制代码)。在执行域中,将该段分配到RAM的地址,并设置该执行域的属性为可执行(例如:使用`+RO`或`+XO`,因为代码是只读且可执行的)。 4. **链接器自动生成复制代码**: 链接器会识别到同一个段有两个不同的地址(加载地址和执行地址),从而在生成的代码中自动加入复制过程(由__main函数在初始化时完成复制)。 #### 示例分散加载文件配置: 基于用户给出的配置,我们修改如下: ```scatter LR_IROM1 0x00000000 0x00010000 { ; 加载域 ER_IROM1 0x00000000 0x00010000 { ; Flash执行区域 - 只读代码 *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) .ANY (+XO) } ; 在Flash中预留一段空间,用于存储需要复制到RAM的函数 ; 注意:这里不需要为这个加载域指定执行域,因为执行域在下面的RAM区域定义 RAM_FUNC_LOAD 0x0000F000 { *(.RAM_FUNC) ; 收集所有标记为.RAM_FUNC的段 } ; 配置表 CML_TABLE 0x0000FC00 { *(_ISP_CML_TABLE) } } ; 定义RAM区域(包括数据段和需要复制到RAM的函数段) RW_ZCD 0x20000000 0x00004000 { ; 假设RAM起始地址0x20000000,大小0x4000 ; 常规的RW和ZI数据 .ANY (+RW +ZI) ; 需要复制到RAM中执行的函数(执行域) RAM_FUNC_EXEC 0x20004000 { ; 从RAM的0x20004000开始 *(.RAM_FUNC) ; 将.RAM_FUNC段放在这里,链接器会在这里生成执行地址 } } ``` #### C代码中的函数标记: ```c // 使用__attribute__将函数放入.RAM_FUNC段 __attribute__((section(".RAM_FUNC"))) void my_fast_function(void) { // 函数体 } ``` #### 工作原理: 1. 编译时,标记了`section(".RAM_FUNC")`的函数会被放入`.RAM_FUNC`段。 2. 链接时,链接器将`.RAM_FUNC`段放入加载域`RAM_FUNC_LOAD`(位于Flash地址0x0000F000),同时指定执行域`RAM_FUNC_EXEC`位于RAM地址0x20004000。 3. 在启动过程中,__main函数(由启动代码调用)会自动将`.RAM_FUNC`段从Flash的0x0000F000复制到RAM的0x20004000,然后跳转到主函数(main)。 4. 这样,在程序运行时,调用`my_fast_function`函数时,实际上执行的是RAM中的代码,而无需用户手动复制。 #### 注意事项: - 确保执行域的地址范围在RAM的合法地址内。 - 确保加载域的地址范围在Flash的合法地址内,且不与其他段重叠。 - 如果自动生成的复制代码(__main)被修改,需要确保复制过程不被破坏。 ### 验证方法: 1. 编译链接后,查看生成的map文件,确认`.RAM_FUNC`段的加载地址(在Flash中)和执行地址(在RAM中)是否正确。 2. 在调试器中,观察函数`my_fast_function`的地址是否在RAM区域(0x20004000开始),并在启动后检查该地址处的代码是否与Flash中的一致。 ### 相关问题: 1. 如何防止分散加载文件中的区域地址重叠? 2. 如果函数需要放在RAM中执行,除了分散加载文件外,代码中还需要注意哪些事项? 3. 如何验证函数确实是从RAM中执行而不是从Flash中执行? 4. 在分散加载文件中如何定义多个需要复制到RAM的函数段? </think>### 分散加载文件自动化方案 针对您提供的 `LR_IROM1` 配置代码,以下实现**零手动复制**的完整解决方案(基于Keil工具链): #### 1. 自动防溢出配置(解决引用[4]问题) ```scatter LR_IROM1 0x00000000 0x00011000 { ; 原始大小0x10000 → 扩容10% ER_IROM1 0x00000000 0x00011000 { *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) .ANY (+XO) } RW_ZCD_LOAD 0x0000F000 { _flash_load_addr = .; *(RAM_ZCD_FUNC) ; RAM函数自动加载点 } CML_TABLE 0x0000FC00 { *(_ISP_CML_TABLE) } } ``` **自动化原理**: - 区域大小 `0x00011000 = 0x10000 × 1.1`(10%安全裕量) - 通过编译脚本自动计算扩容比例: $$ \text{NewSize} = \lceil \text{UsedSize} \times 1.1 \rceil $$ 在Makefile中添加: ```makefile post_build: python adjust_scatter.py $(PROJECT).map ``` #### 2. RAM函数零复制技术 ```c // 函数声明(无需修改实现) __attribute__((section("RAM_ZCD_FUNC"), long_call)) void Critical_Func(void); // 链接器自动完成: // 1. 编译时标记段RAM_ZCD_FUNC // 2. 启动时__main自动复制到RAM ``` **关键配置**: ```scatter RW_ZCD_LOAD 0x0000F000 { ; FLASH加载地址 *(RAM_ZCD_FUNC) ; 标记需要复制的函数 } RW_IRAM1 0x20000000 0x4000 { ; RAM执行地址 *(RAM_ZCD_FUNC) ; 相同段名触发自动复制 } ``` #### 3. 自动化构建流程 ```mermaid graph TB A[源码编译] --> B[生成.map文件] B --> C[Python脚本分析] C --> D[自动调整.sct文件] D --> E[二次链接] E --> F[生成无错误固件] ``` **脚本示例** (`adjust_scatter.py`): ```python import re def adjust_size(map_file): with open(map_file) as f: data = f.read() used = re.search(r'LR_IROM1\s+0x\w+\s+(\d+)', data).group(1) new_size = hex(int(int(used)*1.1)) with open('project.sct', 'r+') as sct: content = sct.read() content = re.sub(r'(LR_IROM1\s+0x\w+\s+)0x\w+', r'\g<1>' + new_size, content) sct.seek(0) sct.write(content) ``` ### 验证方法 1. **物理地址验证**: 在map文件中检查: ``` Execution Region RW_IRAM1 (Base: 0x20000000, Size: 0x00001000) Critical_Func 0x20000100 Section RAM_ZCD_FUNC ``` 2. **复制过程验证**: 在启动文件`startup.s`中观察`__main`的初始化代码,包含自动复制操作。 ### 注意事项 1. 函数对齐要求: 确保RAM_ZCD_FUNC中的函数满足指令集对齐(ARM Cortex-M需4字节对齐) ```c __attribute__((aligned(4))) // 强制4字节对齐 ``` 2. 中断安全: 复制过程需在系统初始化完成前执行,避免中断调用未复制的函数[^3] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值