色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

使用SPARK和Ada進行代碼清理

星星科技指導員 ? 來源:嵌入式計算設計 ? 作者:Quentin Ochem ? 2022-06-29 14:33 ? 次閱讀

您能以多快的速度將軟件推出并準備好?

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

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

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

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

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

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

下面逐步檢查實際的 Ada 或 SPARK 實現。

規格

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

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

poYBAGK78nGAD0OmAABUGzjQXjE060.png

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

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

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

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

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

pYYBAGK78niAFDibAAD08l6mA7w598.png

上面聲明了一個數據結構以及一些與邊界相關的字段:

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

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

最后,為R提供了它在內存中的地址。

實施(在 SPARK/Ada 或 C 中)

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

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

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

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

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

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

poYBAGK78oKATkTCAAAToRMnhxI551.png

除了來自 C 的實現聲明之外,規范在 Ada/SPARK 中完全相同。

pYYBAGK78omATLbXAABqTT0eGgk084.png

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

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

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

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

poYBAGK78pGAb2ocAAALyR35hnM557.png

這里不需要按位運算,因為編譯器會在后臺自動生成適當的代碼。

確認

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

對于較低級別的數據結構,也會進行自動一致性驗證。編譯器驗證特定大小是否足以實現所需的數據范圍,沒有數據重疊等。此外,形式證明可用于驗證分配的值是否始終在任何分配的范圍內。

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

pYYBAGK78peANHeCAABDFxa3C4Q122.png

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

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

舊的又是新的

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

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

審核編輯:郭婷

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

    關注

    2910

    文章

    44752

    瀏覽量

    374569
  • C語言
    +關注

    關注

    180

    文章

    7608

    瀏覽量

    137119
  • 編譯器
    +關注

    關注

    1

    文章

    1636

    瀏覽量

    49172
收藏 人收藏

    評論

    相關推薦

    ADA4945數據手冊中給出的應用參考案例,ADA4945供電電源并非常規電源大小,7.5V和-2.5V供電是怎么得來的?

    ADA4945數據手冊中給出的應用參考案例,ADA4945供電電源并非常規電源大小,7.5V和-2.5V供電是怎么得來的?
    發表于 12-19 09:12

    ADA4637仿真時遇到的幾個問題求解

    老師們好,我在使用ADA4637放大一個包絡信號,其輸出是打算與一個DCDC變換器的輸出比較,然后為一個28V漏極電源電壓的功率放大器漏極供電, 為了實現這個輸出能達到28V的電壓,這里
    發表于 12-19 08:38

    Minitab 數據清理與預處理技巧

    Minitab是一款功能強大的統計分析和質量管理軟件,在數據分析過程中,數據清理與預處理是至關重要的環節。以下是一些在Minitab中進行數據清理與預處理的技巧: 一、數據導入與格式調整 導入數據
    的頭像 發表于 12-02 16:06 ?411次閱讀

    spark為什么比mapreduce快?

    spark為什么比mapreduce快? 首先澄清幾個誤區: 1:兩者都是基于內存計算的,任何計算框架都肯定是基于內存的,所以網上說的spark是基于內存計算所以快,顯然是錯誤的 2;DAG計算模型
    的頭像 發表于 09-06 09:45 ?288次閱讀

    ADA4350芯片作跨阻放大時,ADA的關斷電阻是多少?

    各位專家,用ADA4350芯片作跨阻放大時,I-V轉換,當反饋電阻達到GΩ時,其他小于GΩ的電阻會分流,這是仿真的情況,實際是否會出現類似情況,或者ADA的關斷電阻是多少?
    發表于 07-23 06:59

    使用ADA4522-1仿真電路時,仿真時間很長的原因?

    我在使用ADA4522-1仿真電路時,得不到預期的結果,而且仿真時間很長,當我換成其他一些芯片(例如AD8675)時,仿真瞬間完成,且和我預期相同,請問這個原因出現在哪里?我能用ADA4522設計以下電路嗎?
    發表于 07-23 06:24

    spark運行的基本流程

    前言: 由于最近對spark的運行流程非常感興趣,所以閱讀了《Spark大數據處理:技術、應用與性能優化》一書。通過這本書的學習,了解了spark的核心技術、實際應用場景以及性能優化的方法。本文旨在
    的頭像 發表于 07-02 10:31 ?424次閱讀
    <b class='flag-5'>spark</b>運行的基本流程

    Spark基于DPU的Native引擎算子卸載方案

    Spark Streaming)、機器學習(Spark MLlib)和圖計算(GraphX)。Spark?使用內存加載保存數據并進行迭代計算,減少磁盤溢寫,同時支持 Java、Sca
    的頭像 發表于 06-28 17:12 ?710次閱讀
    <b class='flag-5'>Spark</b>基于DPU的Native引擎算子卸載方案

    關于Spark的從0實現30s內實時監控指標計算

    前言 說起Spark,大家就會自然而然地想到Flink,而且會不自覺地將這兩種主流的大數據實時處理技術進行比較。然后最終得出結論:Flink實時性大于Spark。 的確,Flink中的數據計算
    的頭像 發表于 06-14 15:52 ?475次閱讀

    關于Docker 的清理命令集錦

    這篇文章主要介紹了Docker 清理命令集錦,需要的朋友可以參考下 復制代碼代碼如下: docker kill $(docker ps -a -q) ?刪除所有已經停止的容器 復制代碼
    的頭像 發表于 06-13 15:56 ?395次閱讀

    使用ADA4571放在轉子外側進行離軸測量,為什么產生的正余弦波形是畸變的呢?

    ADA4571 這是我的安裝方式: 這是傳感器輸出的波形: 如圖,藍色是正弦波,有很明顯的傾斜,黃色是余弦波形,底部明顯比頂部寬 為什么會這樣畸變呢?是轉子不符合要求嗎,但是沒在ADA4571相關手冊中找到相關要求
    發表于 05-30 08:05

    Spark基于DPU Snappy壓縮算法的異構加速方案

    一、總體介紹 1.1 背景介紹 Apache Spark是專為大規模數據計算而設計的快速通用的計算引擎,是一種與 Hadoop 相似的開源集群計算環境,但是兩者之間還存在一些不同之處,這些不同之處使
    的頭像 發表于 03-26 17:06 ?839次閱讀
    <b class='flag-5'>Spark</b>基于DPU Snappy壓縮算法的異構加速方案

    RDMA技術在Apache Spark中的應用

    背景介紹 在當今數據驅動的時代,Apache?Spark已經成為了處理大規模數據集的首選框架。作為一個開源的分布式計算系統,Spark因其高效的大數據處理能力而在各行各業中廣受歡迎。無論是金融服務
    的頭像 發表于 03-25 18:13 ?1558次閱讀
    RDMA技術在Apache <b class='flag-5'>Spark</b>中的應用

    基于DPU和HADOS-RACE加速Spark 3.x

    、Python、Java、Scala、R)等特性在大數據計算領域被廣泛使用。其中,Spark SQL 是 Spark 生態系統中的一個重要組件,它允許用戶以結構化數據的方式進行數據處理,提供了強大
    的頭像 發表于 03-25 18:12 ?1392次閱讀
    基于DPU和HADOS-RACE加速<b class='flag-5'>Spark</b> 3.x

    如何清理完arcgis殘留文件

    清理完ArcGIS殘留文件是一個相對復雜的過程,需要逐個清理相關的文件和注冊表項。下面介紹如何清理完ArcGIS殘留文件。 步驟一:準備工作 在開始清理前,請確保你已經退出ArcGIS
    的頭像 發表于 02-25 13:59 ?4752次閱讀
    主站蜘蛛池模板: 久久综合久久鬼| 中文字幕精品在线视频| 黄页网址大全免费观看| 99精品免费在线观看| 午夜伦伦电影理论片大片| 暖暖的高清视频在线观看免费中文 | 成年女人免费影院播放| 一个人的免费完整在线观看HD| 日本熟妇乱妇熟色A片蜜桃| 猫咪最新破解版下载| 国产亚洲tv在线观看| 超碰97视频在线观看| 最新中文字幕在线视频| 迅雷哥在线观看高清| 三级黃60分钟| 欧美肥婆性生活| 伦理片在线线看手机版| 国厂精品114福利电影| 国产成人精品视频播放| 拔擦拔擦8X永久华人免费播放器| 宅男午夜大片又黄又爽大片| 亚洲成人精品| 午夜精品久久久久久久99蜜桃| 日本调教网站| 欧美高清视频www夜色资源网| 麻豆成人啪啪色婷婷久久| 精品无码三级在线观看视频| 国产午夜精品视频在线播放| 国产成人精品免费视频大| 成电影人免费网站| 爱情岛aqdlttv| jizzjizz3d动漫| 99久久综合精品免费| 999久久久无码国产精蜜柚| 2021自产拍在线观看视频| 早乙女由依在线观看| 伊人久久影视| 中文字幕 日韩 无码 在线| 在线观看精品视频看看播放| 一本道亚洲区免费观看| 野花日本大全免费高清完整版|