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

    文章

    1623

    浏览量

    49103
  • C程序
    +关注

    关注

    4

    文章

    254

    浏览量

    36021
收藏 人收藏

    评论

    相关推荐

    ADS4142的数据第18页, 4,tSU和tH是怎么定义的?

    我的设计要用到一个ADC 后面连接一个隔离器和DAC,结构如下: 其中: ADC:ADS4142 DAC:DAC5672 ADS4142的数据第18页,
    发表于 12-06 06:38

    OSI七模型的数据封装过程

    OSI(Open Systems Interconnection)七模型,数据的封装过程是从上到下逐进行的。以下是数据封装过程的介绍: 一、封装过程概述 数据封装是指在网络通信
    的头像 发表于 11-24 11:11 461次阅读

    KiCad的阻焊及其应用

    是涂覆在PCB铜箔表面的聚合物。 KiCad(以及其它EDA),阻焊是“负片”。
    的头像 发表于 11-12 12:22 285次阅读
    KiCad<b class='flag-5'>中</b>的阻焊<b class='flag-5'>层</b><b class='flag-5'>及其</b>应用

    详解KiCad

    “  不同EDA对于PCB物理的定义基本相同,比如信号、丝印、阻焊、助焊等。但对于工艺(辅助)的定义会略有不同,比如Altium
    的头像 发表于 11-12 12:21 330次阅读
    详解KiCad<b class='flag-5'>中</b>的<b class='flag-5'>层</b>

    原子镀膜功率器件行业的应用

    本文小编分享一篇文章,本文介绍的是原子镀膜功率器件行业的应用,本文介绍了原子镀膜技术碳化硅功率器件和氮化镓功率器件的应用,并介绍了
    的头像 发表于 10-15 15:21 328次阅读
    原子<b class='flag-5'>层</b>镀膜<b class='flag-5'>在</b>功率器件行业的应用

    开关电源电流检测电阻什么位置

    ,与负载并联。实际应用,电流检测电阻的位置可能会有所不同,但基本原理和作用是相同的。 位置选择原则 选择电流检测电阻的
    的头像 发表于 08-02 09:56 750次阅读

    3D霍尔效应位置传感器的基本原理及其应用案例

    本文将回顾 3D 霍尔效应位置传感器的基本原理,介绍这种传感器机器人、篡改检测、人机接口控制和万向电机系统的应用。然后以 Texas Instruments 的高精度、线性 3D 霍尔效应
    的头像 发表于 08-01 10:04 1264次阅读
    3D霍尔效应<b class='flag-5'>位置</b>传感器的基本原理<b class='flag-5'>及其</b>应用案例

    ESP8266 AT命令固件源代码SDK表单不可用,为什么?

    我想知道 ESP8266 AT 命令固件源代码 SDK 表单不可用
    发表于 07-15 07:05

    神经网络的卷积、池化与全连接

    深度学习,卷积神经网络(Convolutional Neural Network, CNN)是一种特别适用于处理图像数据的神经网络结构。它通过卷积、池化和全连接
    的头像 发表于 07-11 14:18 5365次阅读

    ESP-IDF能否加密应用固件

    描述:我启动了flahs加密,这样物理上可以防止数据的读取和篡改。但在进行https-OTA时,从服务器传输固件到设备的过程,可能会泄露固件。正常使用ESP-IDF编译生成的固件是明
    发表于 06-11 06:50

    无源晶振电子设备位置选择有何要求

    无源晶振,作为电子设备的核心元件之一,对于设备的性能和稳定性起着至关重要的作用。电子设备的设计和制造过程,无源晶振的位置选择需要满足一系列要求,以确保设备的正常运行和最佳性能。一
    的头像 发表于 04-26 08:34 590次阅读
    无源晶振<b class='flag-5'>在</b>电子设备<b class='flag-5'>中</b>的<b class='flag-5'>位置</b>选择有何要求

    什么是PCB叠?PCB叠设计原则

    对于信号,通常每个信号都与内电直接相邻,与其他信号有有效的隔离,以减小串扰。设计过程
    的头像 发表于 04-10 16:02 2397次阅读
    什么是PCB叠<b class='flag-5'>层</b>?PCB叠<b class='flag-5'>层</b>设计原则

    ADC机器人位置传感器的应用,性能兼容ADS1220

    ADC机器人位置传感器的应用,性能兼容ADS1220
    的头像 发表于 03-15 10:20 729次阅读
    ADC<b class='flag-5'>在</b>机器人<b class='flag-5'>位置</b>传感器<b class='flag-5'>中</b>的应用,性能兼容ADS1220

    如何让CYUSBlinux上闪存固件

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

    半导体材料元素周期位置

    半导体材料是一种电子行业中使用广泛的材料,元素周期它们的位置属于一些特定的元素群。半导体材料的特殊性使其成为电子设备制造
    的头像 发表于 01-15 16:55 3204次阅读