0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

表及其在固件層中的位置

劉高 ? 來源:ccly0208 ? 作者:ccly0208 ? 2022-07-28 14:19 ? 次閱讀

通常,需要有一種方法來更改參數(shù)值,而無需重新編譯源代碼。

由于人力短缺,我們最近決定分包一個簡單的電子設計,包括硬件和軟件。我寫了一個規(guī)范,但事實證明,我所期望的常識被設計師完全忽略了,因為他不知道我想要什么。他本可以問的,但那是另一回事了?!叭绻粋€年輕的工程師沒有這方面的知識,也許還有其他人,”我想,此時我感覺博客要上線了(我應該去躺下)。

當您編寫一個軟件時,大多數(shù)時候您使用常量來確定諸如執(zhí)行循環(huán)的次數(shù)、激活輸出之前等待的時間等等。在一個簡單的 C 程序中,這些常量是使用#define宏以如下形式建立的:

#define WAIT_TIME_BEFORE_ACTIVATING_SOLENOID 4000 //time in mS

可以有這些常量的完整列表。當您想修改某些內容時,您只需轉到宏定義,更改值,然后重新編譯。這一切都很好,但是很多時候用戶想要改變系統(tǒng)的性能并且沒有知識或資源來做到這一點,更不用說讓你的源代碼進入公共領域了。所需要的是一種無需重新編譯源代碼即可更改參數(shù)值的方法。

想想您可以在現(xiàn)代車輛中更改的參數(shù)——您可以對鎖車后燈保持亮起的時間進行編程;您可以啟用/禁用接近傳感器并且——根據(jù)汽車的復雜程度——你可以改變幾十到幾百個。現(xiàn)代系統(tǒng)通常將允許使用用戶界面或通過通信通道進行某種下載來更改這些參數(shù)。顯然,這些參數(shù)必須駐留在可以重新配置的內存中——有時是 RAM,但主要是配置為像 EEPROM 一樣執(zhí)行的 EEPROM 或閃存。

當您在 C 中聲明一個常量時,如下所示:

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

大多數(shù)編譯器會將這些組合在一起,并將結果數(shù)據(jù)放在閃存中的某個位置。我不相信有任何保證它們會相鄰。在沒有專用 EEPROM 的 micros 中,并不是所有的 flash 存儲器都可以當作 EEPROM 來處理,所以通常會有一條指令說服編譯器將一些內存空間當作 EEPROM 來處理。例如,在使用 Keil 編譯器的 Cypress PSoC4 上,指令如下所示:

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

但是您的處理器和編譯器會有所不同。

為了確保 EEPROM 中的所有元素都是相鄰的(稍后我將解釋原因),我很想創(chuàng)建一個數(shù)組(或者可能是一個結構),就像我在 PSoC4 聲明中所做的那樣:

uint8_t eepromArray[48];

然后通過一個enum或一組#defines,確定數(shù)組的哪個元素與特定參數(shù)相關聯(lián)。

現(xiàn)在,讓我回到我們將微控制器嵌入恐龍跟蹤設備的時間。那時,還沒有 EEPROM。后來,EEPROM 以外部設備的形式提供。然而,客戶仍然希望在不重新編譯的情況下更改參數(shù)。

開發(fā)系統(tǒng)很笨重,獨立的(通常是便攜式的)PROM 編程器通常是必要設備的一部分。該技術是使用上述一些技術在 EPROM(外部或嵌入在微型計算機中)中創(chuàng)建一個表作為程序的一部分。客戶將能夠使用 EPROM 編程器從主 IC 甚至目標設備讀取二進制代碼,轉到表位置并修改存在的數(shù)字,然后將整個 shebang 編程回空白 EPROM。然后他/她將 EPROM 插回目標套接字——不需要程序匯編-鏈接-加載-編譯。

不同模塊的鏈接和位置是命令行的一部分(可以從批處理文件中輸入),并且有很多關于如何在不同位置定位內存的不同部分的文檔。如果您使用的是外部內存或內存分區(qū)設備,則可能會有很多這樣的分配。不管好壞,這個功能已經(jīng)被升華了,并且作為現(xiàn)代用戶界面的一部分,細節(jié)并不容易獲得,盡管從我有時會在屏幕上看到閃爍的一閃而過的一瞥中,我認為那些命令行可能仍然存在。

在小型系統(tǒng)上,這種舊技術可能仍然是實現(xiàn)客戶可配置性的唯一方法。在引發(fā)此博客的項目中,我們的客戶要求重新配置表格,而我們的分包商將“表格”解釋為一堆#defines重新編譯。

使用const聲明很容易;問題在于桌子的位置。可以從編譯報告中提取內存中的確切位置(同樣,每個處理器/編譯器可能不同),但該位置可能因每次編譯迭代而異。使用固定位置的想法有很多值得推薦的地方。我對如何使用 PSoC 微控制器解決這個問題有一個相當好的想法,但上述項目中的處理器是 Microchip Atmega328,這意味著我有一個大問題——我根本不知道。

有一些關于在 Atmega 上實現(xiàn)此功能的在線討論。該設備實際上具有 EEPROM,因此將表格放在那里可能同樣容易,但這僅在開發(fā)工具允許您更改 EEPROM 值甚至程序存儲器時才有用。時間會證明一切。

兩個分開的想法:一些關鍵任務設備具有檢查內存校驗和以確保程序內存正常的例程。在這種情況下,校驗和計算應排除任何要調整的表。

調整影響軟件性能的參數(shù)實際上可能會突出或掩蓋程序中的缺陷。但不能保證僅僅因為您可以更改性能,您的軟件就沒有錯誤。我曾經(jīng)有一個上司受此錯覺困擾——我在那份工作上只干了三個月。

后記


在重新設計之后,我們的分包商選擇將表格放置在 EEPROM 中。看來 Atmel Studio 7 確實允許您訪問 EEPROM,但它不會將內容顯示為屏幕上的表格。分包商采用的流程是使用 Atmel Studio 7(在 PC 上運行)將 EEPROM 內容讀入 hex 文件,編輯 hex 文件的內容,為已更改的每一行創(chuàng)建一個新的校驗和,重新保存文件,然后將文件寫回 EEPROM。您還必須來回更改一些微型的內部“開關”以訪問 EEPROM,然后返回標準操作。這似乎有點令人費解——我確實希望找到一種更優(yōu)雅的方式。

后記


我剛剛嘗試了 PSoC Programmer,看看是否可以直接從用戶界面 (UI) 修改一個字節(jié)。雖然不需要切換微控制器的編程設置,但不幸的是,它仍然需要與上述相同的技術來編輯 hex 文件。

由于缺乏一個像樣的程序員界面,也許這個整個表格的概念在未來不會起作用。或者也許我們應該投資一個具有合適用戶界面的第三方程序員(如果這樣的野獸仍然存在的話)。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 編譯器
    +關注

    關注

    1

    文章

    1634

    瀏覽量

    49157
  • C程序
    +關注

    關注

    4

    文章

    254

    瀏覽量

    36047
收藏 人收藏

    評論

    相關推薦

    ADS4142的數(shù)據(jù)第18頁, 4,tSU和tH是怎么定義的?

    我的設計要用到一個ADC 后面連接一個隔離器和DAC,結構如下: 其中: ADC:ADS4142 DAC:DAC5672 ADS4142的數(shù)據(jù)第18頁,
    發(fā)表于 12-06 06:38

    OSI七模型的數(shù)據(jù)封裝過程

    OSI(Open Systems Interconnection)七模型,數(shù)據(jù)的封裝過程是從上到下逐進行的。以下是數(shù)據(jù)封裝過程的介紹: 一、封裝過程概述 數(shù)據(jù)封裝是指在網(wǎng)絡通信
    的頭像 發(fā)表于 11-24 11:11 ?698次閱讀

    KiCad的阻焊及其應用

    是涂覆在PCB銅箔表面的聚合物。 KiCad(以及其它EDA),阻焊是“負片”。
    的頭像 發(fā)表于 11-12 12:22 ?375次閱讀
    KiCad<b class='flag-5'>中</b>的阻焊<b class='flag-5'>層</b><b class='flag-5'>及其</b>應用

    詳解KiCad

    “ ?不同EDA對于PCB物理的定義基本相同,比如信號、絲印、阻焊、助焊等。但對于工藝(輔助)的定義會略有不同,比如Altium
    的頭像 發(fā)表于 11-12 12:21 ?427次閱讀
    詳解KiCad<b class='flag-5'>中</b>的<b class='flag-5'>層</b>

    原子鍍膜功率器件行業(yè)的應用

    本文小編分享一篇文章,本文介紹的是原子鍍膜功率器件行業(yè)的應用,本文介紹了原子鍍膜技術碳化硅功率器件和氮化鎵功率器件的應用,并介紹了
    的頭像 發(fā)表于 10-15 15:21 ?359次閱讀
    原子<b class='flag-5'>層</b>鍍膜<b class='flag-5'>在</b>功率器件行業(yè)的應用

    開關電源電流檢測電阻什么位置

    ,與負載并聯(lián)。實際應用,電流檢測電阻的位置可能會有所不同,但基本原理和作用是相同的。 位置選擇原則 選擇電流檢測電阻的
    的頭像 發(fā)表于 08-02 09:56 ?818次閱讀

    3D霍爾效應位置傳感器的基本原理及其應用案例

    本文將回顧 3D 霍爾效應位置傳感器的基本原理,介紹這種傳感器機器人、篡改檢測、人機接口控制和萬向電機系統(tǒng)的應用。然后以 Texas Instruments 的高精度、線性 3D 霍爾效應
    的頭像 發(fā)表于 08-01 10:04 ?1360次閱讀
    3D霍爾效應<b class='flag-5'>位置</b>傳感器的基本原理<b class='flag-5'>及其</b>應用案例

    ESP8266 AT命令固件源代碼SDK表單不可用,為什么?

    我想知道 ESP8266 AT 命令固件源代碼 SDK 表單不可用
    發(fā)表于 07-15 07:05

    神經(jīng)網(wǎng)絡的卷積、池化與全連接

    深度學習,卷積神經(jīng)網(wǎng)絡(Convolutional Neural Network, CNN)是一種特別適用于處理圖像數(shù)據(jù)的神經(jīng)網(wǎng)絡結構。它通過卷積、池化和全連接
    的頭像 發(fā)表于 07-11 14:18 ?6229次閱讀

    ESP-IDF能否加密應用固件

    描述:我啟動了flahs加密,這樣物理上可以防止數(shù)據(jù)的讀取和篡改。但在進行https-OTA時,從服務器傳輸固件到設備的過程,可能會泄露固件。正常使用ESP-IDF編譯生成的固件是明
    發(fā)表于 06-11 06:50

    無源晶振電子設備位置選擇有何要求

    無源晶振,作為電子設備的核心元件之一,對于設備的性能和穩(wěn)定性起著至關重要的作用。電子設備的設計和制造過程,無源晶振的位置選擇需要滿足一系列要求,以確保設備的正常運行和最佳性能。一
    的頭像 發(fā)表于 04-26 08:34 ?625次閱讀
    無源晶振<b class='flag-5'>在</b>電子設備<b class='flag-5'>中</b>的<b class='flag-5'>位置</b>選擇有何要求

    什么是PCB疊?PCB疊設計原則

    對于信號,通常每個信號都與內電直接相鄰,與其他信號有有效的隔離,以減小串擾。設計過程
    的頭像 發(fā)表于 04-10 16:02 ?2480次閱讀
    什么是PCB疊<b class='flag-5'>層</b>?PCB疊<b class='flag-5'>層</b>設計原則

    ADC機器人位置傳感器的應用,性能兼容ADS1220

    ADC機器人位置傳感器的應用,性能兼容ADS1220
    的頭像 發(fā)表于 03-15 10:20 ?759次閱讀
    ADC<b class='flag-5'>在</b>機器人<b class='flag-5'>位置</b>傳感器<b class='flag-5'>中</b>的應用,性能兼容ADS1220

    如何讓CYUSBlinux上閃存固件?

    你好, 我想通過控制中心 linux 刷新固件。 Windows ,我們有支持 EZUSB 的控制中心來刷新
    發(fā)表于 02-22 06:23

    半導體材料元素周期位置

    半導體材料是一種電子行業(yè)中使用廣泛的材料,元素周期它們的位置屬于一些特定的元素群。半導體材料的特殊性使其成為電子設備制造
    的頭像 發(fā)表于 01-15 16:55 ?3702次閱讀