0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

表及其在固件层中的位置

刘高 来源:ccly0208 作者:ccly0208 2022-07-28 14:19 次阅读

通常,需要有一种方法来更改参数值,而无需重新编译源代码。

由于人力短缺,我们最近决定分包一个简单的电子设计,包括硬件和软件。我写了一个规范,但事实证明,我所期望的常识被设计师完全忽略了,因为他不知道我想要什么。他本可以问的,但那是另一回事了。“如果一个年轻的工程师没有这方面的知识,也许还有其他人,”我想,此时我感觉博客要上线了(我应该去躺下)。

当您编写一个软件时,大多数时候您使用常量来确定诸如执行循环的次数、激活输出之前等待的时间等等。在一个简单的 C 程序中,这些常量是使用#define宏以如下形式建立的:

#define WAIT_TIME_BEFORE_ACTIVATING_SOLENOID 4000 //time in mS

可以有这些常量的完整列表。当您想修改某些内容时,您只需转到宏定义,更改值,然后重新编译。这一切都很好,但是很多时候用户想要改变系统的性能并且没有知识或资源来做到这一点,更不用说让你的源代码进入公共领域了。所需要的是一种无需重新编译源代码即可更改参数值的方法。

想想您可以在现代车辆中更改的参数——您可以对锁车后灯保持亮起的时间进行编程您可以启用/禁用接近传感器并且——根据汽车的复杂程度——你可以改变几十到几百个。现代系统通常将允许使用用户界面或通过通信通道进行某种下载来更改这些参数。显然,这些参数必须驻留在可以重新配置的内存中——有时是 RAM,但主要是配置为像 EEPROM 一样执行的 EEPROM 或闪存。

当您在 C 中声明一个常量时,如下所示:

const uint16_t iVariable1 = 45;
const uint16_t iVariable2[4]= {45,46,47,48};

大多数编译器会将这些组合在一起,并将结果数据放在闪存中的某个位置。我不相信有任何保证它们会相邻。在没有专用 EEPROM 的 micros 中,并不是所有的 flash 存储器都可以当作 EEPROM 来处理,所以通常会有一条指令说服编译器将一些内存空间当作 EEPROM 来处理。例如,在使用 Keil 编译器的 Cypress PSoC4 上,指令如下所示:

const uint8_t EmEEPROM_em_EepromStorage[EmEEPROM_PHYSICAL_SIZE] __ALIGNED(CY_FLASH_SIZEOF_ROW) = {0u};

但是您的处理器和编译器会有所不同。

为了确保 EEPROM 中的所有元素都是相邻的(稍后我将解释原因),我很想创建一个数组(或者可能是一个结构),就像我在 PSoC4 声明中所做的那样:

uint8_t eepromArray[48];

然后通过一个enum或一组#defines,确定数组的哪个元素与特定参数相关联。

现在,让我回到我们将微控制器嵌入恐龙跟踪设备的时间。那时,还没有 EEPROM。后来,EEPROM 以外部设备的形式提供。然而,客户仍然希望在不重新编译的情况下更改参数。

开发系统很笨重,独立的(通常是便携式的)PROM 编程器通常是必要设备的一部分。该技术是使用上述一些技术在 EPROM(外部或嵌入在微型计算机中)中创建一个表作为程序的一部分。客户将能够使用 EPROM 编程器从主 IC 甚至目标设备读取二进制代码,转到表位置并修改存在的数字,然后将整个 shebang 编程回空白 EPROM。然后他/她将 EPROM 插回目标套接字——不需要程序汇编-链接-加载-编译。

不同模块的链接和位置是命令行的一部分(可以从批处理文件中输入),并且有很多关于如何在不同位置定位内存的不同部分的文档。如果您使用的是外部内存或内存分区设备,则可能会有很多这样的分配。不管好坏,这个功能已经被升华了,并且作为现代用户界面的一部分,细节并不容易获得,尽管从我有时会在屏幕上看到闪烁的一闪而过的一瞥中,我认为那些命令行可能仍然存在。

在小型系统上,这种旧技术可能仍然是实现客户可配置性的唯一方法。在引发此博客的项目中,我们的客户要求重新配置表格,而我们的分包商将“表格”解释为一堆#defines重新编译。

使用const声明很容易;问题在于桌子的位置。可以从编译报告中提取内存中的确切位置(同样,每个处理器/编译器可能不同),但该位置可能因每次编译迭代而异。使用固定位置的想法有很多值得推荐的地方。我对如何使用 PSoC 微控制器解决这个问题有一个相当好的想法,但上述项目中的处理器是 Microchip Atmega328,这意味着我有一个大问题——我根本不知道。

有一些关于在 Atmega 上实现此功能的在线讨论。该设备实际上具有 EEPROM,因此将表格放在那里可能同样容易,但这仅在开发工具允许您更改 EEPROM 值甚至程序存储器时才有用。时间会证明一切。

两个分开的想法:一些关键任务设备具有检查内存校验和以确保程序内存正常的例程。在这种情况下,校验和计算应排除任何要调整的表。

调整影响软件性能的参数实际上可能会突出或掩盖程序中的缺陷。但不能保证仅仅因为您可以更改性能,您的软件就没有错误。我曾经有一个上司受此错觉困扰——我在那份工作上只干了三个月。

后记


在重新设计之后,我们的分包商选择将表格放置在 EEPROM 中。看来 Atmel Studio 7 确实允许您访问 EEPROM,但它不会将内容显示为屏幕上的表格。分包商采用的流程是使用 Atmel Studio 7(在 PC 上运行)将 EEPROM 内容读入 hex 文件,编辑 hex 文件的内容,为已更改的每一行创建一个新的校验和,重新保存文件,然后将文件写回 EEPROM。您还必须来回更改一些微型的内部“开关”以访问 EEPROM,然后返回标准操作。这似乎有点令人费解——我确实希望找到一种更优雅的方式。

后记


我刚刚尝试了 PSoC Programmer,看看是否可以直接从用户界面 (UI) 修改一个字节。虽然不需要切换微控制器的编程设置,但不幸的是,它仍然需要与上述相同的技术来编辑 hex 文件。

由于缺乏一个像样的程序员界面,也许这个整个表格的概念在未来不会起作用。或者也许我们应该投资一个具有合适用户界面的第三方程序员(如果这样的野兽仍然存在的话)。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编译器
    +关注

    关注

    1

    文章

    1576

    浏览量

    48606
  • C程序
    +关注

    关注

    4

    文章

    253

    浏览量

    35750
收藏 人收藏

    评论

    相关推荐

    STM32初运行如何确定为.BSS段分配多大的空间及其空间首地址信息?

    ),.BSS位置及大小信息在哪(如何计算出来的),如果是处于这些固件固件的内部组成是怎样的?另外,了解到.elf文件是包含了.BSS 信息,但是STM32多是烧录 .bin 文件
    发表于 03-25 07:40

    如何让CYUSBlinux上闪存固件

    你好, 我想通过控制中心 linux 刷新固件 Windows ,我们有支持 EZUSB 的控制中心来刷新
    发表于 02-22 06:23

    如何使用PSOC 4进行蓝牙位置跟踪?

    我们正在将 PSOC 4 用于可穿戴设备。 我想知道是否可以升级固件以添加位置追踪? 例如 将蓝牙 LE 与 Airtag 固件或其他东西一起使用。 也许是用于蓝牙位置追踪的 SDK?
    发表于 01-23 07:16

    TCP/IP5模型,应用是如何与传输连接的?

    以TCP/IP5模型,应用是如何与传输连接的 “封装”又是指什么?显示全部
    发表于 10-28 06:53

    用于缓解高速缓存推测漏洞的固件接口

    称为变体4,是某些ARM CPU设计的漏洞,可能允许对内存位置的推测性读取最近一次写入该内存位置之前读取数据值。 推测性读取的数据可能是攻击者控制的,并被转发到以后的推测性访问,这
    发表于 08-25 07:36

    安装STM32cubeMX及F4固件

    固件
    jf_06209345
    发布于 :2023年07月05日 22:24:05

    KEIL,使用F8下载固件正常,但用DAPLink的拖放更新的时候,无法写入固件怎么解决?

    你好,最近在做了个板子,目标芯片用的是 M484SIDAE2U。 KEIL ,使用 F8 下载固件正常,但用 DAPLink 的拖放更新的时候,无法写入固件。 所以,想自己编译一
    发表于 06-28 06:08

    详解KiCad

    ,以此类推。除了这些铜之外,还有其他技术和文件可供选择。 可以“电路板设置”查看所有的
    发表于 06-21 12:13

    通过USB VCOM下载固件FMC_APROM_SIZE/2的位置,如何实现实现启动任意地址上的固件

    背景: 我用自定义协议, 通过 USB VCOM下载固件 FMC_APROM_SIZE/2 的位置. 问题: 如何 下载完毕后就自动加载此位置上的固件
    发表于 06-20 07:16

    Courtyard如何使用?

    ​“ 使用Allegro的小伙伴应该很清楚Courtyard的用法,但使用Altium Designer的小伙伴可能对Courtyard完全没有概念。Courtyard到底是什么?
    发表于 06-13 13:01

    KiCad的阻焊及其应用

    是涂覆在PCB铜箔表面的聚合物。 KiCad(以及其它EDA),阻焊是“负片”。
    发表于 06-12 11:03

    KiCad的Edge.Cut与Margin

    的要求,以确定电路板的物理轮廓。有些板厂要求板框显示每一的Gerber文件;有些板厂则要求板框只出现在一个单独的Gerber文件,独立展示。(KiCAD的 "绘图 &
    发表于 06-06 09:46

    LoRa通信技术智能燃气的应用

    技术的原理   智能燃气的远程通信采用LoRa技术,主要是利用LoRa所融合的前向纠错编码技术和扩频调制技术。前向纠错编码技术是给待传输数据序列增加一些冗余信息,这样数据传输进程中注入的错误码元
    发表于 05-11 10:22

    pads 2007 LAYOUT怎么地网或其它位置直接添加过孔?

    pads 2007 LAYOUT怎么地网或其它位置直接添加过孔?
    发表于 04-28 16:44