使用Simulink開發Autosar Nvm存儲邏輯

文章目錄

    • 前言
    • Autosar Nvm接口
    • 設計模型及接口
    • 生成代碼及arxml
    • RTE接口mapping
    • RTE代碼分析
    • 總結

前言

之前介紹過Simulink開發Dem故障觸發邏輯,本文接著介紹另外一個常用的功能-Nvm存儲的實現。

Autosar Nvm接口

Autosar Nvm中一般在上電初始化的時調用Nvm_ReadAll獲取Nvm block的數據到Ram中。對于block來說,可以通過Nvm_ReadBlock進行讀取,通過Nvm_WriteBlock進行寫入。Autosar Dem標準接口為NvMService,使用Simulink中自帶的demo-autosar_bsw_sensor中的定義,如下所示:在這里插入圖片描述
需要注意的是:生成的package位置為/AUTOSAR/Services/Dem(暫時沒找到怎么修改),而在使用時,導入對應Autosar工具(例如Etas)時可能會找不到對應的定義。此處我們后面是手動更改arxml中的package路徑

設計模型及接口

配置Nvm的ClientPort,如下所示
在這里插入圖片描述
Nvm需要使用到Simulink自帶的Data Store Memory模塊,如下所示
在這里插入圖片描述
在初始化函數中進行Nvm讀取
在這里插入圖片描述
配置Nvm的Port及讀取的函數
在這里插入圖片描述

做了一個簡單的存儲邏輯:當輸入值小于存儲的值時,觸發Nvm的存儲
在這里插入圖片描述
寫入需要使用Data Store Write,然后使用Data Store Read調用WriteBlock進行寫入,如下所示
在這里插入圖片描述
配置Nvm的Port及寫入的函數
在這里插入圖片描述

Nvm的Functions Callers在刷新后會自動生成并mapping
在這里插入圖片描述

生成代碼及arxml

生成的代碼中調用了RTE函數Rte_Call_S1LowSetPoint_ReadBlock用來讀取Nvm,調用RTE函數Rte_Call_S1LowSetPoint_WriteBlock用來寫入Nvm,示例如下:


/* Model step function */
void Runnable_Step(void)
{uint16 rtb_RelationalOperator_tmp;boolean rtb_RelationalOperator;/* Outport: '<Root>/Percent' incorporates:*  DataTypeConversion: '<Root>/Data Type Conversion'*  Inport: '<Root>/RawADC'*  Lookup_n-D: '<Root>/TPS Lookup'*/Rte_IWrite_Runnable_Step_Percent_Percent(rtCP_TPSLookup_tableData[plook_u32f_linckan(Rte_IRead_Runnable_Step_RawADC_RawADC(), rtCP_TPSLookup_bp01Data, 10U)]);/* Outputs for Triggered SubSystem: '<Root>/Enabled Subsystem' incorporates:*  TriggerPort: '<S1>/Trigger'*//* RelationalOperator: '<Root>/Relational Operator' incorporates:*  DataStoreWrite: '<S1>/Data Store Write'*  Inport: '<Root>/RawADC'*/rtb_RelationalOperator_tmp = Rte_IRead_Runnable_Step_RawADC_RawADC();/* End of Outputs for SubSystem: '<Root>/Enabled Subsystem' *//* RelationalOperator: '<Root>/Relational Operator' incorporates:*  DataStoreRead: '<Root>/Data Store Read'*  Inport: '<Root>/RawADC'*/rtb_RelationalOperator = (rtb_RelationalOperator_tmp < rtARID_DEF.LowSetPoint);/* Outputs for Triggered SubSystem: '<Root>/Enabled Subsystem' incorporates:*  TriggerPort: '<S1>/Trigger'*/if (rtb_RelationalOperator && (rtARID_DEF.EnabledSubsystem_Trig_ZCE !=POS_ZCSIG)) {/* DataStoreWrite: '<S1>/Data Store Write' */rtARID_DEF.LowSetPoint = rtb_RelationalOperator_tmp;/* FunctionCaller: '<S1>/NvMServiceCaller1' */Rte_Call_S1LowSetPoint_WriteBlock(&rtARID_DEF.LowSetPoint);}rtARID_DEF.EnabledSubsystem_Trig_ZCE = rtb_RelationalOperator;/* End of Outputs for SubSystem: '<Root>/Enabled Subsystem' */
}/* Model initialize function */
void Runnable_Init(void)
{/* Start for DataStoreMemory: '<Root>/Data Store Memory' */rtARID_DEF.LowSetPoint = 50U;/* SystemInitialize for Triggered SubSystem: '<Root>/Enabled Subsystem' */rtARID_DEF.EnabledSubsystem_Trig_ZCE = ZERO_ZCSIG;/* End of SystemInitialize for SubSystem: '<Root>/Enabled Subsystem' *//* Outputs for Atomic SubSystem: '<Root>/Initialize_Function' *//* FunctionCaller: '<S2>/NvMServiceCaller' */Rte_Call_S1LowSetPoint_ReadBlock(&rtARID_DEF.LowSetPoint);/* End of Outputs for SubSystem: '<Root>/Initialize_Function' */
}

對應的arxml中也生成了對應的接口描述
在這里插入圖片描述
此處對應的package路徑不對,需要替換成ETAS Nvm對應路徑(/AUTOSAR_NvM/PortInterfaces/),替換完后copy到ETAS工具鏈中

在這里插入圖片描述

RTE接口mapping

如果是新增的SWC,還需要將SWC映射到對應的EcucPartition上,且對應的runnable也要映射到對應的task上,本文不介紹這部分內容,默認上述工作已經完成

注意:初始化的Runnable在SWC中沒有對應的Event,原因是Simulink中未配置,需要配置如下:
在這里插入圖片描述

此處默認對應的NVM block已經建立好了(Nvm block需要配置NvMRbGenRteServicePort為True)。在對應的Nvm ServiceSwComponent中已經有了對應的Pport
Simulink生成的Arxml中的SWC中已經有了對應的NVM接口(Rport,Client接口)
在這里插入圖片描述
Runnable中也有了對應調用關系

在這里插入圖片描述
在這里插入圖片描述
注意:此處生成的Server Call Point是Async接口,會導致后面ETAS生成RTE時生成Alarm和其他無關的代碼,我們不需要,此處需要手動修改為Sync接口,如下所示:
在這里插入圖片描述
在這里插入圖片描述

將SWC接口與NVM接口進行mapping
在這里插入圖片描述
mapping好后進行ECU Extract,然后生成RTE代碼即可

RTE代碼分析

在生成的SWC RTE頭文件中,有對應的接口調用宏定義

#if defined(RTE_PRV_ALL_API) || defined(RTE_RUNNABLEAPI_Runnable_Init)
/* Inline function call optimization; Rte_Call_S1LowSetPoint_ReadBlock to NvM_ReadBlock */
#define Rte_Call_S1LowSetPoint_ReadBlock( DstPtr ) NvM_ReadBlock(((VAR(NvM_BlockIdType, AUTOMATIC))43), DstPtr)#endif
#if defined(RTE_PRV_ALL_API) || defined(RTE_RUNNABLEAPI_Runnable_Step)
/* Inline function call optimization; Rte_Call_S1LowSetPoint_WriteBlock to NvM_WriteBlock */
#define Rte_Call_S1LowSetPoint_WriteBlock( SrcPtr ) NvM_WriteBlock(((VAR(NvM_BlockIdType, AUTOMATIC))43), SrcPtr)#endif

自動生成的宏中實際也是調用的對應Nvm的函數,只是加上了對應的Nvm id,這樣的話,應用層也不需要關心是具體是哪個Nvm id了

總結

使用Simulink Nvm模塊可以減少一部分Nvm相關的RTE接口,能夠節省一部分存儲交互的工作量。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/80203.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/80203.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/80203.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java—— 泛型詳解

泛型概述 泛型是JDK5中引入的特性&#xff0c;可以在編譯階段約束操作的數據類型&#xff0c;并進行檢查。 泛型的格式&#xff1a;<數據類型> 注意&#xff1a;泛型只能支持引用數據類型。 泛型的好處 沒有泛型的時候&#xff0c;可以往集合中添加任意類型的數據&#x…

通俗的橋接模式

橋接模式&#xff08;Bridge Pattern&#xff09; 就像一座橋&#xff0c;把兩個原本獨立變化的東西連接起來&#xff0c;讓它們可以各自自由變化&#xff0c;互不干擾。簡單來說&#xff0c;就是 “把抽象和實現分開&#xff0c;用組合代替繼承”。 一句話理解橋接模式 假設你…

【現代深度學習技術】注意力機制04:Bahdanau注意力

【作者主頁】Francek Chen 【專欄介紹】 ? ? ?PyTorch深度學習 ? ? ? 深度學習 (DL, Deep Learning) 特指基于深層神經網絡模型和方法的機器學習。它是在統計機器學習、人工神經網絡等算法模型基礎上&#xff0c;結合當代大數據和大算力的發展而發展出來的。深度學習最重…

爬蟲學習————開始

&#x1f33f;自動化的思想 任何領域的發展原因————“不斷追求生產方式的改革&#xff0c;即使得付出與耗費精力越來愈少&#xff0c;而收獲最大化”。由此&#xff0c;創造出方法和設備來提升效率。 如新聞的5W原則直接讓思考過程規范化、流程化。或者前端框架/后端輪子的…

每天五分鐘機器學習:KTT條件

本文重點 在前面的課程中,我們學習了拉格朗日乘數法求解等式約束下函數極值,如果約束不是等式而是不等式呢?此時就需要KTT條件出手了,KTT條件是拉格朗日乘數法的推廣。KTT條件不僅統一了等式約束與不等式約束的優化問題求解范式,KTT條件給出了這類問題取得極值的一階必要…

leetcode0829. 連續整數求和-hard

1 題目&#xff1a; 連續整數求和 官方標定難度&#xff1a;難 給定一個正整數 n&#xff0c;返回 連續正整數滿足所有數字之和為 n 的組數 。 示例 1: 輸入: n 5 輸出: 2 解釋: 5 2 3&#xff0c;共有兩組連續整數([5],[2,3])求和后為 5。 示例 2: 輸入: n 9 輸出: …

window 顯示驅動開發-線性伸縮空間段

線性伸縮空間段類似于線性內存空間段。 但是&#xff0c;伸縮空間段只是地址空間&#xff0c;不能容納位。 若要保存位&#xff0c;必須分配系統內存頁&#xff0c;并且必須重定向地址空間范圍以引用這些頁面。 內核模式顯示微型端口驅動程序&#xff08;KMD&#xff09;必須實…

Cadence 高速系統設計流程及工具使用三

5.8 約束規則的應用 5.8.1 層次化約束關系 在應用約束規則之前&#xff0c;我們首先要了解這些約束規則是如何作用在 Cadence 設計對象上的。Cadence 中對設計對象的劃分和概念&#xff0c;如表 5-11 所示。 在 Cadence 系統中&#xff0c;把設計對象按層次進行了劃分&#…

ScaleTransition 是 Flutter 中的一個動畫組件,用于實現縮放動畫效果。

ScaleTransition 是 Flutter 中的一個動畫組件&#xff0c;用于實現縮放動畫效果。它允許你對子組件進行動態的縮放變換&#xff0c;從而實現平滑的動畫效果。ScaleTransition 通常與 AnimationController 和 Tween 一起使用&#xff0c;以控制動畫的開始、結束和過渡效果。 基…

深入解析:如何基于開源p-net快速開發Profinet從站服務

一、Profinet協議與軟協議棧技術解析 1.1 工業通信的"高速公路" Profinet作為工業以太網協議三巨頭之一,采用IEEE 802.3標準實現實時通信,具有: 實時分級:支持RT(實時)和IRT(等時實時)通信模式拓撲靈活:支持星型、樹型、環型等多種網絡結構對象模型:基于…

m個n維向量組中m,n的含義與空間的關系

向量的維度與空間的關系&#xff1a; 一個向量的維度由其分量個數決定&#xff0c;例如 ( n ) 個分量的向量屬于 Rn空間 。 向量組張成空間的維度&#xff1a; 當向量組有 ( m ) 個線性無關的 ( n ) 維向量時&#xff1a; 若 ( m < n )&#xff1a; 這些向量張成的是 Rn中的…

excel大表導入數據庫

前文介紹了數據量較小的excel表導入數據庫的方法&#xff0c;在數據量較大的情況下就不太適合了&#xff0c;一個是因為mysql命令的執行串長度有限制&#xff0c;二是node-xlsx這個模塊加載excel文件是整個文件全部加載到內存&#xff0c;在excel文件較大和可用內存受限的場景就…

Python 爬蟲基礎入門教程(超詳細)

一、什么是爬蟲&#xff1f; 網絡爬蟲&#xff08;Web Crawler&#xff09;&#xff0c;又稱網頁蜘蛛&#xff0c;是一種自動抓取互聯網信息的程序。爬蟲會模擬人的瀏覽行為&#xff0c;向網站發送請求&#xff0c;然后獲取網頁內容并提取有用的數據。 二、Python爬蟲的基本原…

Spring Security 深度解析:打造堅不可摧的用戶認證與授權系統

Spring Security 深度解析&#xff1a;打造堅不可摧的用戶認證與授權系統 一、引言 在當今數字化時代&#xff0c;構建安全可靠的用戶認證與授權系統是軟件開發中的關鍵任務。Spring Security 作為一款功能強大的 Java 安全框架&#xff0c;為開發者提供了全面的解決方案。本…

【物聯網】基于樹莓派的物聯網開發【1】——初識樹莓派

使用背景 物聯網開發從0到1研究&#xff0c;以樹莓派為基礎 場景介紹 系統學習Linux、Python、WEB全棧、各種傳感器和硬件 接下來程序貓將帶領大家進軍物聯網世界&#xff0c;從0開始入門研究樹莓派。 認識樹莓派 正面圖示&#xff1a; 1&#xff1a;樹莓派簡介 樹莓派…

第21節:深度學習基礎-激活函數比較(ReLU, Sigmoid, Tanh)

1. 引言 在深度學習領域,激活函數是神經網絡中至關重要的組成部分 它決定了神經元是否應該被激活以及如何將輸入信號轉換為輸出信號 激活函數為神經網絡引入了非線性因素,使其能夠學習并執行復雜的任務 沒有激活函數,無論神經網絡有多少層,都只能表示線性變換,極大地限…

Fiori學習專題三十:Routing and Navigation

實際上我們的頁面是會有多個的&#xff0c;并且可以在多個頁面之間跳轉&#xff0c;這節課就學習如何在不同頁面之間實現跳轉。 1.修改配置文件manifest.json&#xff0c;加入routing&#xff0c;包含三個部分&#xff0c;config,routes,targets; config &#xff1a; routerC…

【HarmonyOS NEXT+AI】問答05:ArkTS和倉頡編程語言怎么選?

在“HarmonyOS NEXTAI大模型打造智能助手APP(倉頡版)”課程里面&#xff0c;有學員提到了這樣一個問題&#xff1a; 鴻蒙的主推開發語言不是ArkTS嗎&#xff0c;本課程為什么使用的是倉頡編程語言&#xff1f; 這里就這位同學的問題&#xff0c;統一做下回復&#xff0c;以方便…

Booth Encoding vs. Non-Booth Multipliers —— 穿透 DC 架構看乘法器的底層博弈

目錄 &#x1f9ed; 前言 &#x1f331; 1. Non-Booth 乘法器的實現原理&#xff08;也叫常規乘法器&#xff09; &#x1f527; 構建方式 ?? 例子&#xff1a;4x4 Non-Booth 乘法器示意 &#x1f9f1; 硬件結構 ? 特點總結 ? 2. Booth Encoding&#xff08;布斯編碼…

GET請求如何傳復雜數組參數

背景 有個歷史項目&#xff0c;是GET請求&#xff0c;但是很多請求還是復雜參數&#xff0c;比如&#xff1a;參數是數組&#xff0c;且數組中每一個元素都是復雜的對象&#xff0c;這個時候怎么傳參數呢&#xff1f; 看之前請求直接是拼接在url后面 類似&items%5B0%5D.…