91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

使用SPARK和Ada進(jìn)行代碼清理

星星科技指導(dǎo)員 ? 來源:嵌入式計算設(shè)計 ? 作者:Quentin Ochem ? 2022-06-29 14:33 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

您能以多快的速度將軟件推出并準(zhǔn)備好?

長期以來,這個單一的問題推動了大部分嵌入式工業(yè)行業(yè)。按時發(fā)布此年度版本,滿足該功能里程碑。只要軟件功能相對簡單或次于系統(tǒng)功能,就可以了。

但隨著系統(tǒng)復(fù)雜性和互連性的日益增加,曾經(jīng)是良性的小故障或“故障”現(xiàn)在正在造成威脅,有時甚至危及人的生命。無人機(jī)、自動駕駛汽車和醫(yī)療設(shè)備是這一趨勢的三個非常重要的代表。那么問題就不再是軟件能否按時交付,而是正確、安全、可靠的軟件能否及時交付。這是一個完全不同的野獸。

除了驗證它正在做它應(yīng)該做的事情之外,沒有太多可以做的事情來交付正確的軟件。不幸的是,傳統(tǒng)的軟件開發(fā)方法并不是為了簡化正式規(guī)范或優(yōu)化驗證成本而設(shè)計的。而且越晚檢測到問題,修復(fù)的成本就越高,以至于在第一天需要幾分鐘才能解決的問題可能會在集成過程中持續(xù)數(shù)月。是的,使用傳統(tǒng)語言和環(huán)境編寫極其強(qiáng)大的軟件是可能的,但成本高得離譜。

特別是對于在微控制器MCU) 上運行的嵌入式應(yīng)用程序,一個更加復(fù)雜的因素是編寫測試的難度。當(dāng)涉及低級嵌入式功能時,編寫甚至運行廣泛的測試活動可能是不切實際的。任何可以在這些程序之前幫助清除問題或確保正確性的東西都可以節(jié)省大量成本。

另一方面,從一開始就利用表達(dá)性和正式的規(guī)范,使實施者更容易尊重需求,提供自動驗證,從而防止問題或在開發(fā)周期的早期發(fā)現(xiàn)問題。

Ada 和 SPARK 語言在這方面提供了獨特的解決方案,將規(guī)范、編碼和驗證集成到一個通用的形式中。這些語言的核心原則是在軟件級別盡可能多地指定,以便在實現(xiàn)時可以驗證盡可能多的組件。

下面逐步檢查實際的 Ada 或 SPARK 實現(xiàn)。

規(guī)格

在將 Ada 和 SPARK 語言與替代語言進(jìn)行比較時,突出的一件事是可以添加到軟件源代碼中以捕獲除實際功能之外的約束和意圖的信息量。數(shù)據(jù)類型不僅僅是一個整數(shù)或浮點數(shù):它是一個語義實體,可以與一組有效值、一組操作、最小精度、內(nèi)存表示,甚至物理維度相關(guān)聯(lián)。同樣,函數(shù)不僅僅是一種從參數(shù)計算值的方法:它有一組可以調(diào)用的條件,在它返回時提供一組保證,并對它的環(huán)境(參數(shù)和全局變量)產(chǎn)生影響)。

Ada 和 SPARK 有很多特性可以用來豐富規(guī)范,但是為了本文的目的,我們選擇一個例子:

poYBAGK78nGAD0OmAABUGzjQXjE060.png

這個簡單的過程在其屬性和行為方面揭示了很多:

首先,C 是一個in out參數(shù),所以它必須在被調(diào)用之前被初始化,并且它的值在子程序中被修改。請注意,沒有指示它是通過復(fù)制還是引用傳遞,這是由編譯器根據(jù)語言約束和效率自動決定的。

E 是輸入?yún)?shù),或不打算修改的輸入值。一個前提條件是在調(diào)用之前容器未滿。就設(shè)計而言,這是一個極其重要的轉(zhuǎn)變,就像在其他語言中的Push過程可能負(fù)責(zé)檢測錯誤的調(diào)用上下文(如果容器已滿)并實施緩解技術(shù)(或防御性代碼)。另一方面,使用先決條件,該過程可以安全地假設(shè)容器未滿(否則它會被靜態(tài)或動態(tài)檢測到,但稍后會詳細(xì)介紹)并避免這些額外的代碼。驗證輸入的責(zé)任隱含在調(diào)用者身上,然后調(diào)用者可以將其提升給自己的調(diào)用者,直到到達(dá)代碼中數(shù)據(jù)驗證確實有意義的地方。

后置條件提供了有關(guān)過程行為的關(guān)鍵屬性——這里,E 包含在修改后的容器中并且計數(shù)增加的事實。

查看與嵌入式開發(fā)相關(guān)的一些約束,另一個有用的方面是指定內(nèi)存映射約束。Ada 允許聲明式表示法來指定數(shù)據(jù)結(jié)構(gòu)在內(nèi)存中的布局方式和地址,從而避免容易出錯的按位操作和一致性檢查。例如:

pYYBAGK78niAFDibAAD08l6mA7w598.png

上面聲明了一個數(shù)據(jù)結(jié)構(gòu)以及一些與邊界相關(guān)的字段:

數(shù)據(jù)的大小固定為 16 位,接下來的兩個方面(具有值High_Order_First)基本上告訴編譯器使用大端表示。

下一個子句提供特定的位表示(例如,Size從索引位1到4的字節(jié)0開始。

最后,為R提供了它在內(nèi)存中的地址。

實施(在 SPARK/Ada 或 C 中)

Ada 和 SPARK 語言提供了現(xiàn)代命令式語言的大部分功能。這些功能如何實現(xiàn)的最顯著特性是它們?yōu)榫幾g器解釋提供的空間很小并且避免了捷徑。例如,沒有隱式轉(zhuǎn)換,并且輕松地執(zhí)行指針運算之類的操作需要 5 行代碼。但是,在實際編碼階段花費的額外時間很容易通過易于驗證來重新獲得,無論是用于代碼閱讀、測試還是靜態(tài)分析。

在討論的這一點上,值得一提的是房間里的大象:對于新開發(fā)的代碼來說,使用一種新語言可能是一個好主意,但通常存在一個不容忽視的預(yù)先存在的環(huán)境。這通常是來自其他項目或現(xiàn)成庫的代碼。這段代碼可能是用 C 語言或 C++ 創(chuàng)建的。僅此一項就經(jīng)常驅(qū)動開發(fā)語言的選擇。

幸運的是,SPARK 和 Ada 已被設(shè)計為與 C 環(huán)境很好地集成。一些指令可以將 C 直接映射到 Ada,反之亦然,而無需任何包裝代碼的開銷。這種映射甚至可以自動生成。

因此,如果不推薦的話,在 SPARK 或 Ada 中僅開始開發(fā)幾個組件,而在其他情況下保留在 C 環(huán)境中是完全合理的。

目前可用于 Ada 和 SPARK 的主要編譯器技術(shù)是 GCC,但也可以提供其他編譯器技術(shù)。這意味著 SPARK 和 C 代碼可以使用相同的技術(shù)進(jìn)行編譯,具有相同的優(yōu)化和代碼生成通道。結(jié)果,C 和 SPARK 代碼之間的性能幾乎沒有差異,并且沒有從一種語言到另一種語言的控制流的損失。

談到我們之前的一個例子,讓我們假設(shè)正在使用一個用 C 實現(xiàn)的容器。我們試圖與之交互的 C 代碼如下所示:

poYBAGK78oKATkTCAAAToRMnhxI551.png

除了來自 C 的實現(xiàn)聲明之外,規(guī)范在 Ada/SPARK 中完全相同。

pYYBAGK78omATLbXAABqTT0eGgk084.png

Ada 或 SPARK 代碼可以像在 Ada 中實現(xiàn)一樣使用此過程。與導(dǎo)入類似,導(dǎo)出允許 C 調(diào)用用 Ada 編寫的子程序。如果需要,這些接口層可以通過綁定生成器自動生成。

盡管將 SPARK 和 C 一起編譯解決了許多用例,但仍然存在最終代碼必須是 C 的情況。確實,一些用戶雖然對使用 SPARK 進(jìn)行開發(fā)感興趣,但仍需要將 C 代碼交付給他們的客戶。

可以使用一個特殊的編譯器來覆蓋這個用例,即“GNAT 通用代碼生成器”。它本質(zhì)上將 Ada 語言的一個子集編譯為 C。借助這項技術(shù),SPARK 幾乎成為一種建模語言,其輸出集成在 C 環(huán)境中。它也可以被視為一種交付形式驗證的 C 代碼的方式,驗證在 SPARK 級別執(zhí)行。

在數(shù)據(jù)表示示例(寄存器案例)中,在代碼中使用這段數(shù)據(jù)非常簡單。分配一個值如下所示:

poYBAGK78pGAb2ocAAALyR35hnM557.png

這里不需要按位運算,因為編譯器會在后臺自動生成適當(dāng)?shù)拇a。

確認(rèn)

Ada 和 SPARK 在源代碼中提供了大量信息,可供各種檢查器使用。例如,作為第一道防線,編譯器將檢測到許多不一致之處,并可以在測試階段自動在可執(zhí)行文件中插入動態(tài)驗證。有了這個級別的信息,就可以超越經(jīng)典的靜態(tài)分析并應(yīng)用程序驗證技術(shù)來演示整個應(yīng)用程序的屬性。

對于較低級別的數(shù)據(jù)結(jié)構(gòu),也會進(jìn)行自動一致性驗證。編譯器驗證特定大小是否足以實現(xiàn)所需的數(shù)據(jù)范圍,沒有數(shù)據(jù)重疊等。此外,形式證明可用于驗證分配的值是否始終在任何分配的范圍內(nèi)。

繼續(xù)前面的另一個示例,假設(shè)在我們想要驗證的一段代碼中調(diào)用了Push 。例如,我們可以讓以下語句從輸入文件中讀取數(shù)字,直到它達(dá)到 0:

pYYBAGK78peANHeCAABDFxa3C4Q122.png

這個Push調(diào)用將被 SPARK 工具標(biāo)記為不正確,因為無法知道循環(huán)不會達(dá)到容器 C 的最大容量。證明者無法證明Push的前提條件,這顯然應(yīng)該在調(diào)用,而不是在被調(diào)用的過程中。如果到達(dá)文件末尾而沒有擊中0 ,則示例代碼中可能會出現(xiàn)另一個潛在錯誤。如果指定了適當(dāng)?shù)南葲Q條件,證明者將能夠判斷循環(huán)中缺少檢查以驗證是否仍需要讀取輸入。

這種問題通常會在某個時候發(fā)生。如果覆蓋極端案例的單元測試足夠廣泛,那么問題將在該級別得到解決。然而,當(dāng)真正的數(shù)據(jù)開始輸入系統(tǒng)時,他們可以找到自己的方式進(jìn)行集成測試,或者當(dāng)用戶試圖破壞系統(tǒng)時進(jìn)行 beta 測試。在最壞的情況下,其中一些錯誤會通過部署找到并需要在客戶報告后進(jìn)行追蹤。問題不是它們是否會被發(fā)現(xiàn),而是當(dāng)它們被發(fā)現(xiàn)時修復(fù)它們的成本會有多高。越晚發(fā)現(xiàn),越多的人參與到鏈條中,需要更多的調(diào)查來確定源頭、修復(fù)問題、證明修復(fù)的合理性、測試修復(fù)、重新交付產(chǎn)品等。使用技術(shù)早期集成驗證 - 在這種情況下,

舊的又是新的

Ada 和 SPARK 方法的獨特之處在于它集成了軟件規(guī)范、實現(xiàn)和驗證,提供了一種以現(xiàn)代系統(tǒng)所需的完整性級別生產(chǎn)軟件的經(jīng)濟(jì)高效的方法。醫(yī)療、汽車和工業(yè)物聯(lián)網(wǎng) (IIoT) 等行業(yè)一直在尋找傳統(tǒng) C 語言開發(fā)的替代方案,Ada 和 SPARK 提供了經(jīng)過驗證的解決方案。

作為 Ada 語言的提供者,AdaCore 在過去幾年中觀察到對該技術(shù)的新興趣。今天的限制提供了一個嘗試新事物的好機(jī)會——或者正在卷土重來的舊事物。

審核編輯:郭婷

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

    關(guān)注

    2945

    文章

    47820

    瀏覽量

    415045
  • C語言
    +關(guān)注

    關(guān)注

    183

    文章

    7644

    瀏覽量

    145605
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1672

    瀏覽量

    51618
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    ADA4896-2:高性能運放的探索與應(yīng)用

    ADA4896-2/ADA4897-1/ADA4897-2:高性能運放的探索與應(yīng)用 在電子設(shè)計領(lǐng)域,高性能運放一直是工程師們關(guān)注的重點。今天,我們就來深入探討一款具有卓越性能的運放產(chǎn)品
    的頭像 發(fā)表于 01-22 15:30 ?182次閱讀

    深入剖析ADA4084系列運放:特性、應(yīng)用與設(shè)計要點

    深入剖析ADA4084系列運放:特性、應(yīng)用與設(shè)計要點 作為電子工程師,在設(shè)計電路時,選擇合適的運算放大器至關(guān)重要。今天,我們就來詳細(xì)探討一下Analog Devices公司推出的ADA
    的頭像 發(fā)表于 01-22 15:20 ?178次閱讀

    解析ADA4432-1/ADA4433-1:SD視頻濾波放大器的卓越之選

    解析ADA4432-1/ADA4433-1:SD視頻濾波放大器的卓越之選 在當(dāng)今的電子設(shè)計領(lǐng)域,視頻處理系統(tǒng)對于信號的質(zhì)量和穩(wěn)定性有著極高的要求,特別是在汽車和監(jiān)控等嚴(yán)苛環(huán)境中。Analog
    的頭像 發(fā)表于 01-19 15:50 ?181次閱讀

    ADA4939-1/ADA4939-2:超低失真差分 ADC 驅(qū)動器的卓越之選

    ADA4939-1/ADA4939-2:超低失真差分 ADC 驅(qū)動器的卓越之選 在電子設(shè)計領(lǐng)域,高性能的 ADC 驅(qū)動器對于確保系統(tǒng)的精準(zhǔn)數(shù)據(jù)采集和信號處理至關(guān)重要。今天,我們就來深入探討一款備受
    的頭像 發(fā)表于 01-13 09:25 ?331次閱讀

    超低失真差分 ADC 驅(qū)動器 ADA4938-1/ADA4938-2 深度解析

    超低失真差分 ADC 驅(qū)動器 ADA4938-1/ADA4938-2 深度解析 作為電子工程師,在進(jìn)行硬件設(shè)計開發(fā)時,選擇合適的 ADC 驅(qū)動器至關(guān)重要。今天我們就來詳細(xì)探討一下 Analog
    的頭像 發(fā)表于 01-13 09:20 ?345次閱讀

    超低失真差分ADC驅(qū)動器ADA4937-1/ADA4937-2:高性能之選

    超低失真差分ADC驅(qū)動器ADA4937-1/ADA4937-2:高性能之選 作為電子工程師,在設(shè)計高性能數(shù)據(jù)采集和信號處理系統(tǒng)時,選擇合適的ADC驅(qū)動器至關(guān)重要。ADA
    的頭像 發(fā)表于 01-12 17:25 ?445次閱讀

    超低失真差分 ADC 驅(qū)動器 ADA4937-1/ADA4937-2 深度解析

    超低失真差分 ADC 驅(qū)動器 ADA4937-1/ADA4937-2 深度解析 在電子設(shè)計領(lǐng)域,高性能的 ADC 驅(qū)動器對于確保系統(tǒng)的精度和穩(wěn)定性至關(guān)重要。今天,我們就來深入探討一下 Analog
    的頭像 發(fā)表于 01-12 17:20 ?539次閱讀

    低成本有源射頻分配器ADA4304-3/ADA4304-4:特性、應(yīng)用與設(shè)計要點

    低成本有源射頻分配器ADA4304-3/ADA4304-4:特性、應(yīng)用與設(shè)計要點 在電子工程師的日常設(shè)計工作中,射頻分配器是一個常見且關(guān)鍵的器件。今天,我們就來詳細(xì)探討一下Analog
    的頭像 發(fā)表于 01-12 17:20 ?432次閱讀

    解析ADA4932-1/ADA4932-2:高性能低功耗ADC驅(qū)動的理想之選

    解析ADA4932-1/ADA4932-2:高性能低功耗ADC驅(qū)動的理想之選 在電子設(shè)計領(lǐng)域,ADC驅(qū)動的性能對整個系統(tǒng)的表現(xiàn)起著關(guān)鍵作用。ADA4932-1/ADA4932-2作為下
    的頭像 發(fā)表于 01-12 16:10 ?290次閱讀

    低電壓ADC的超低噪聲驅(qū)動器ADA4930-1/ADA4930-2深度解析

    Devices推出的超低噪聲、低失真、高速差分放大器,為驅(qū)動1.8V高性能ADC提供了理想解決方案。下面將從特性、應(yīng)用、工作原理等多個方面進(jìn)行詳細(xì)剖析。 文件下載: ADA4930-2.pdf 特性亮點 低噪聲
    的頭像 發(fā)表于 01-12 15:25 ?262次閱讀

    如何在DGX Spark上運行NVIDIA Omniverse

    首先感謝 Vigor 同學(xué)第一時間的分享,以下是具體如何在 DGX Spark 上運行 Omniverse 的方法。
    的頭像 發(fā)表于 12-17 10:13 ?618次閱讀
    如何在DGX <b class='flag-5'>Spark</b>上運行NVIDIA Omniverse

    NVIDIA DGX Spark系統(tǒng)恢復(fù)過程與步驟

    在使用 NVIDIA DGX Spark 的過程中,可能會出現(xiàn)配置故障,而導(dǎo)致開發(fā)中斷的問題,本篇教程將帶大家了解如何一步步完成系統(tǒng)恢復(fù)。
    的頭像 發(fā)表于 11-28 09:46 ?5205次閱讀
    NVIDIA DGX <b class='flag-5'>Spark</b>系統(tǒng)恢復(fù)過程與步驟

    NVIDIA DGX Spark助力構(gòu)建自己的AI模型

    2025 年 1 月 6 日,NVIDIA 正式宣布其 Project DIGITS 項目,并于 3 月 18 日更名為 NVIDIA DGX Spark,進(jìn)一步公布了產(chǎn)品細(xì)節(jié)。DGX Spark
    的頭像 發(fā)表于 11-21 09:25 ?1170次閱讀
    NVIDIA DGX <b class='flag-5'>Spark</b>助力構(gòu)建自己的AI模型

    NVIDIA DGX Spark快速入門指南

    NVIDIA DGX Spark 已正式向 AI 開發(fā)者交付,對于剛?cè)胧值娜?DGX Spark,該如何進(jìn)行初始化設(shè)置?本篇文章將引導(dǎo)您完成 DGX Spark 首次設(shè)置。在初始設(shè)置
    的頭像 發(fā)表于 11-17 14:11 ?6059次閱讀
    NVIDIA DGX <b class='flag-5'>Spark</b>快速入門指南

    ADA4807-1 adi

    電子發(fā)燒友網(wǎng)為你提供ADI(ADI)ADA4807-1相關(guān)產(chǎn)品參數(shù)、數(shù)據(jù)手冊,更有ADA4807-1的引腳圖、接線圖、封裝手冊、中文資料、英文資料,ADA4807-1真值表,ADA48
    發(fā)表于 03-11 18:52
    <b class='flag-5'>ADA</b>4807-1 adi