一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

IEC61508系統(tǒng)中的動態(tài)內(nèi)存使用

麥克泰技術(shù) ? 來源:麥克泰技術(shù) ? 2025-04-11 15:17 ? 次閱讀

IEC 61508標(biāo)準(zhǔn)強(qiáng)烈推薦使用靜態(tài)內(nèi)存管理方式。在安全應(yīng)用設(shè)計(jì)中,我們都在遵循這個建議。但我們可能會需要這樣的功能:

? 運(yùn)行時配置

? 刪除組件的編譯時配置

? 更靈活的控制外部行為或硬件

? 平臺作為完整的一代產(chǎn)品

這些功能需要動態(tài)內(nèi)存管理解決方案。

IEC61508中推薦使用靜態(tài)內(nèi)存管理方式的原因與動態(tài)內(nèi)存管理相關(guān)的編程錯誤導(dǎo)致的潛在風(fēng)險(xiǎn)相關(guān),我們必須避免和發(fā)現(xiàn)這些編程錯誤,潛在風(fēng)險(xiǎn)包括:

1 內(nèi)存碎片

2 沒有可用內(nèi)存

3 空閑內(nèi)存丟失

4 內(nèi)存釋放到錯誤內(nèi)存池

5 內(nèi)存多次釋放

6 釋放后繼續(xù)使用內(nèi)存

7 使用時釋放內(nèi)存

一類解決方案只允許分配內(nèi)存,這類解決方案通過避免內(nèi)存重用來解決上述問題中的3-7,這是一種有效的解決方案,通常用于不同產(chǎn)品變體啟動期間中的內(nèi)存靈活配置,在運(yùn)行期間保持內(nèi)存布局不變。

當(dāng)這類方法不能滿足需求時,我們需要一種更通用的方法來系統(tǒng)地避免或檢測所有列出的風(fēng)險(xiǎn)情況。

1內(nèi)存碎片

內(nèi)存碎片是一種效應(yīng),當(dāng)我們使用不同的內(nèi)存大小執(zhí)行多個分配和釋放周期時可能會產(chǎn)生這種效應(yīng)。

在實(shí)時系統(tǒng)中,我們需要確定性和恒定的執(zhí)行時間。使用改進(jìn)的分配算法(如首次適配算法),執(zhí)行時間嚴(yán)重將依賴于以前的內(nèi)存活動,這對我們的系統(tǒng)設(shè)計(jì)是不利的。

避免內(nèi)存碎片的方法是使用一個(或一組)固定大小的內(nèi)存塊池。好消息是專業(yè)的實(shí)時內(nèi)核為用戶提供了固定大小內(nèi)存塊的內(nèi)存管理機(jī)制,用戶可以使用實(shí)時內(nèi)核提供的這些服務(wù)。在本文中,我們考慮實(shí)時內(nèi)核的主函數(shù)接口。

作為參考,一個簡單的使用序列為:

ptr =MemAlloc(pool);
/* use memory via ptr */
MemFree(pool, ptr);

在啟動過程中調(diào)用:

pool= Create(mem, size, num);

2沒有可用內(nèi)存

如果沒有足夠的內(nèi)存滿足當(dāng)前分配請求,內(nèi)存分配函數(shù)會反饋相應(yīng)信息(如NULL指針)。用戶應(yīng)該檢查函數(shù)返回值并采取適當(dāng)?shù)拇胧?/p>

ptr =MemAlloc(pool);
if(ptr ==NULL) {
 MemErrOutOfMemory(pool);
}
/* use memory via ptr */
MemFree(pool, ptr);

使用實(shí)時內(nèi)核時,我們可以通過擴(kuò)展內(nèi)存分配函數(shù),進(jìn)一步避免丟失檢查和失敗處理的風(fēng)險(xiǎn),使用阻塞等待空閑內(nèi)存:

ptr =MemAllocWait(pool);
/* use memory via ptr */
MemFree(pool, ptr);
ptr =MemAllocWait(pool);

通過阻塞等待方式確保返回的指針是一個有效的內(nèi)存塊。強(qiáng)制性安全任務(wù)監(jiān)視器將檢測任務(wù)是否在定義的截止時間內(nèi)獲得足夠的內(nèi)存。

3內(nèi)存釋放到錯誤內(nèi)存池

如果用戶負(fù)責(zé)將內(nèi)存釋放到正確的內(nèi)存池中(例如,內(nèi)存池是釋放內(nèi)存的參數(shù)),可能會出錯。我們可以通過向info區(qū)域添加額外的參數(shù)來避免這個錯誤。為了簡單(快速)地訪問這些數(shù)據(jù),info區(qū)作為已分配內(nèi)存的一部分。應(yīng)用程序不能使用這部分?jǐn)?shù)據(jù),并且位于應(yīng)用程序內(nèi)存塊引用的前面:

ab69f732-1681-11f0-9310-92fbcf53809c.png

改進(jìn)后的內(nèi)存使用順序如下:

ptr =MemAllocWait(pool);
/* use memory via ptr */
MemFree(ptr);

4空閑內(nèi)存丟失

所謂的“內(nèi)存泄漏”發(fā)生在內(nèi)存分配且被使用之后,但沒有釋放內(nèi)存塊的時候。此錯誤不容易檢測,特別是當(dāng)分配和釋放操作將在不同的函數(shù)(或任務(wù))中實(shí)現(xiàn)時。

在不知道應(yīng)用程序細(xì)節(jié)的情況下,檢測內(nèi)存泄漏的一種方法是使用內(nèi)存看門狗,看門狗的工作方式類似于通常使用的執(zhí)行看門狗。

假設(shè)在內(nèi)存分配過程中定義了一個看門狗時間,這迫使我們在這段時間內(nèi)觸發(fā)看門狗,以保持內(nèi)存塊有效。

我們將內(nèi)存計(jì)時數(shù)據(jù)存儲在info區(qū)域中。

為了檢查所有分配的內(nèi)存塊的看門狗時間周期,我們引入了一個檢查函數(shù)。下列偽代碼可以幫助了解我們?nèi)绾螜z查內(nèi)存塊。

voidMemCheck(pool)
{
 foreach'block'in'pool'do:
   if('block::timeout'isgreater than0) then:
      decrement'block::timeout'by1
   if('block::timeout'isequal to0) then:
     callMemErrTimeout(block)
}

我們系統(tǒng)安全自檢過程中定期調(diào)用這個函數(shù)。使用序列如下所示。

ptr =MemAllocWait(timeout, pool);
MemUseTrigger(ptr);
/*use memory via ptr*/
MemFree(ptr);

如果錯過了看門狗時間周期,我們可以在回調(diào)函數(shù)中執(zhí)行適當(dāng)?shù)膭幼鳎?/p>

voidMemErrTimeout(ptr)
{
 /* action on timeout: */
 /* log diagnostic data */
 /* initiate safe state */
}

5內(nèi)存多次釋放

當(dāng)在沒有檢測機(jī)制的情況下多次(錯誤地)釋放一個內(nèi)存塊時,可能導(dǎo)致正在運(yùn)行系統(tǒng)的奇怪行為。這種錯誤很難調(diào)試,必須避免。

在info區(qū)域中添加一個額外的冗余值,可以非常有效地處理這個問題。推薦使用內(nèi)存池參數(shù)的補(bǔ)值,需在內(nèi)存分配函數(shù)中將這兩個值設(shè)置為匹配的一對。

內(nèi)存釋放函數(shù)可以檢查這些冗余信息,將內(nèi)存塊放回相應(yīng)的內(nèi)存池中,然后破壞冗余信息。實(shí)現(xiàn)偽代碼如下:

voidMemFree(ptr)
{
 if('ptr::pool'isequal to complement of'ptr::inv_pool') then:
    release memory block'ptr'to'ptr::pool'
   set'ptr::inv_pool'to'ptr::pool'
 else:
   callMemErrDoubleFree(ptr)
}

最后,我們可以在回調(diào)函數(shù)中為這種錯誤情況定義適當(dāng)?shù)牟僮鳎篗emErrDoubleFree(ptr)。

6釋放后繼續(xù)使用內(nèi)存

這個編程錯誤聽起來不可思議,但在多任務(wù)環(huán)境中,這個錯誤可能存在,在最壞的情況下,很長一段時間都沒有被發(fā)現(xiàn)。

為了檢測這種情況,我們可以重用info區(qū)域中的數(shù)據(jù)冗余。在這種情況下,我們在使用內(nèi)存塊之前檢查冗余是否損壞。為了使代碼順序盡可能簡單,我們可以集成內(nèi)存看門狗觸發(fā):

voidMemStartAccess(ptr)
{
 if('ptr::pool'is not equal to complement of'ptr::inv_pool') then:
    callMemErrUsedFree(ptr)
 else
    set'ptr::timeout'to'ptr::watchdog_time'
}

最后,在回調(diào)函數(shù)MemErrUsedFree(ptr)中為這種錯誤情況定義適當(dāng)?shù)牟僮鳌?/p>

在使用內(nèi)存塊之前,該檢測機(jī)制將需要一個額外的函數(shù)調(diào)用。

ptr =MemAllocWait(timeout, pool);
MemStartAccess(ptr);
/* use memory block via ptr */
MemFree(ptr);

7使用時釋放內(nèi)存

這個編程錯誤與前面的錯誤屬于同一類。在多任務(wù)環(huán)境中,可能釋放了被中斷任務(wù)占用的內(nèi)存塊。該任務(wù)重新運(yùn)行時,其使用的內(nèi)存已經(jīng)被釋放。

針對這個問題,我們可以使用一個對稱函數(shù)的解決方案。對應(yīng)MemStartAccess()函數(shù),引入結(jié)束函數(shù)。這個新函數(shù)可以通知用戶內(nèi)存塊不能使用了:

void MemEndAccess (ptr);

通過相應(yīng)的阻塞函數(shù)來釋放內(nèi)存,我們可以避免這類編程錯誤。

void MemFreeWait (ptr);

對應(yīng)的動態(tài)內(nèi)存使用序列如下:

ptr =MemAllocWait(timeout, pool);
MemStartAccess(ptr);
/*use memory block via ptr*/
MemEndAccess(ptr);
MemFreeWait(ptr);

總結(jié)

在本文中,我們發(fā)現(xiàn)了一種在IEC61508系統(tǒng)中使用動態(tài)內(nèi)存的方法,避免相應(yīng)的編程錯誤并在檢測到錯誤后做出響應(yīng)。我們?yōu)檫@些安全功能付出了相應(yīng)的代價:每個分配的內(nèi)存塊將占用額外內(nèi)存空間,消耗了CPU運(yùn)行時間。

盡管如此,還是建議在安全關(guān)鍵型系統(tǒng)中謹(jǐn)慎使用動態(tài)內(nèi)存。

Flexible Safety RTOS是基于μC/OS-II+MPU機(jī)制實(shí)現(xiàn)的功能安全操作系統(tǒng),提供了基于塊的內(nèi)存管理機(jī)制。麥

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

原文標(biāo)題:IEC61508系統(tǒng)中的動態(tài)內(nèi)存使用

文章出處:【微信號:麥克泰技術(shù),微信公眾號:麥克泰技術(shù)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    動態(tài)內(nèi)存管理模塊的設(shè)計(jì)原理與實(shí)現(xiàn)

    Fense 通過設(shè)立一個雙向鏈表(struct Head *stHead)來保存所有被分配的動態(tài)內(nèi)存塊的信息。鏈表的每個節(jié)點(diǎn)對應(yīng)一個動態(tài)內(nèi)存塊,節(jié)點(diǎn)中包括此內(nèi)存大小、分配發(fā)生時所在的
    的頭像 發(fā)表于 06-30 08:05 ?2521次閱讀
    <b class='flag-5'>動態(tài)內(nèi)存</b>管理模塊的設(shè)計(jì)原理與實(shí)現(xiàn)

    C語言知識總結(jié):動態(tài)內(nèi)存分配

    動態(tài)內(nèi)存分配就 是指在程序執(zhí)行的過程動態(tài)地分配或者回收存儲空間的分配內(nèi)存的方法。動態(tài)內(nèi)存分配不像數(shù)組等靜態(tài)
    發(fā)表于 10-24 15:52 ?976次閱讀

    C語言程序設(shè)計(jì)動態(tài)內(nèi)存分配如何實(shí)現(xiàn)

    C語言程序設(shè)計(jì),動態(tài)內(nèi)存分配如何實(shí)現(xiàn),需要注意哪些問題?
    發(fā)表于 09-28 16:53 ?1610次閱讀

    瑞薩電子功能安全IEC61508解決方案介紹(2)

    ? 01 ?瑞薩功能安全IEC61508解決方案介紹(1) 在介紹瑞薩電子功能安全解決方案之前,我們來看一下IEC61508功能安全系統(tǒng)是如何根據(jù)IEC61508標(biāo)準(zhǔn)進(jìn)行概念設(shè)計(jì)、詳細(xì)
    的頭像 發(fā)表于 12-27 14:00 ?1394次閱讀
    瑞薩電子功能安全<b class='flag-5'>IEC61508</b>解決方案介紹(2)

    請問使用動態(tài)內(nèi)存分配安全嗎?

    想在C語言程序員之間開始一個激烈的,或者說有爭議的討論很簡單,只需要問:“使用動態(tài)內(nèi)存分配安全嗎?”使用動態(tài)內(nèi)存分配安全嗎?在C語言程序開發(fā),動態(tài)內(nèi)存分配允許程序在運(yùn)行時向
    發(fā)表于 12-15 06:10

    使用動態(tài)內(nèi)存分配安全嗎

    安全嗎?”為了更加安全穩(wěn)定,美國軍方禁止在C語言程序中使用malloc()使用動態(tài)內(nèi)存分配安全嗎?在C語言程序開發(fā),動態(tài)內(nèi)存分配允許程序在運(yùn)行時向系統(tǒng)申請
    發(fā)表于 12-15 07:44

    動態(tài)內(nèi)存分配是什么意思

    所謂動態(tài)內(nèi)存分配(Dynamic Memory Allocation)就是指在程序執(zhí)行的過程動態(tài)地分配或者回收存儲空間的分配內(nèi)存的方法。動態(tài)內(nèi)存
    發(fā)表于 12-17 08:17

    動態(tài)內(nèi)存錯誤的靜態(tài)檢測

    內(nèi)存泄漏、空指針引用等動態(tài)內(nèi)存錯誤在/,/LL等支持動態(tài)內(nèi)存操作的程序普遍存在在程序動態(tài)內(nèi)存
    發(fā)表于 06-10 16:29 ?52次下載
    <b class='flag-5'>動態(tài)內(nèi)存</b>錯誤的靜態(tài)檢測

    動態(tài)內(nèi)存管理在面向嵌入式實(shí)時系統(tǒng)的研究

    動態(tài)內(nèi)存管理的基本任務(wù)就是有效地對動態(tài)內(nèi)存進(jìn)行分配、回收,并同時保證系統(tǒng)的快速性、可靠性和穩(wěn)定性。當(dāng)系統(tǒng)請求分配內(nèi)存時,
    發(fā)表于 07-22 11:14 ?1194次閱讀

    基于IEC61508開發(fā)功能安全的處理器詳細(xì)介紹

    功能安全的電子系統(tǒng)是響應(yīng)的系統(tǒng)。正如每一組輸入所期望的那樣。功能安全系統(tǒng)是針對定義良好的系統(tǒng)開發(fā)和驗(yàn)證的。特定市場功能安全標(biāo)準(zhǔn)。傘大多數(shù)專用功能的標(biāo)準(zhǔn)電子產(chǎn)品的安全發(fā)展是
    發(fā)表于 04-16 15:51 ?26次下載
    基于<b class='flag-5'>IEC61508</b>開發(fā)功能安全的處理器詳細(xì)介紹

    嵌入式需要用到動態(tài)內(nèi)存

    所謂動態(tài)內(nèi)存分配(Dynamic Memory Allocation)就是指在程序執(zhí)行的過程動態(tài)地分配或者回收存儲空間的分配內(nèi)存的方法。動態(tài)內(nèi)存
    的頭像 發(fā)表于 07-27 08:11 ?3187次閱讀

    嵌入式C語言中的動態(tài)內(nèi)存管理和動態(tài)內(nèi)存分配

    動態(tài)內(nèi)存管理同時還具有一個優(yōu)點(diǎn):當(dāng)程序在具有更多內(nèi)存系統(tǒng)上需要處理更多數(shù)據(jù)時,不需要重寫程序。
    發(fā)表于 08-15 17:16 ?2437次閱讀

    嵌入式是否使用動態(tài)內(nèi)存?

    嵌入式是否應(yīng)該使用動態(tài)內(nèi)存?
    的頭像 發(fā)表于 02-28 17:03 ?1916次閱讀

    Xilinx為IEC61508和ISO26262認(rèn)證的安全應(yīng)用降低風(fēng)險(xiǎn)并提高效率

    電子發(fā)燒友網(wǎng)站提供《Xilinx為IEC61508和ISO26262認(rèn)證的安全應(yīng)用降低風(fēng)險(xiǎn)并提高效率.pdf》資料免費(fèi)下載
    發(fā)表于 09-13 11:33 ?1次下載
    Xilinx為<b class='flag-5'>IEC61508</b>和ISO26262認(rèn)證的安全應(yīng)用降低風(fēng)險(xiǎn)并提高效率

    瑞薩基于IEC61508的功能安全解決方案介紹(1)

    首先,我們將簡單介紹符合IEC61508標(biāo)準(zhǔn)的功能安全,其次是功能安全應(yīng)用示例,以及工程師在功能安全設(shè)計(jì)上所面臨的挑戰(zhàn),最后分享瑞薩功能安全解決方案如何應(yīng)對這些挑戰(zhàn)。
    的頭像 發(fā)表于 05-30 14:19 ?1541次閱讀
    瑞薩基于<b class='flag-5'>IEC61508</b>的功能安全解決方案介紹(1)