日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > 汽車電子 > 糖果Autosar
[導(dǎo)讀]點 擊 上 方 藍 字 ? ? 關(guān) 注 我 們 引言 記得年輕的時候去面試一家大廠的嵌入式軟件工程師的職位,面試官讓很多候選人三人一組討論去設(shè)計一款A(yù)TM機,當時我們那組討論的熱火朝天,什么把Linux操作系統(tǒng)內(nèi)核移植過來,加入互鎖機制確保取錢的安全性,什么多線

    關(guān)




引言

記得年輕的時候去面試一家大廠的嵌入式軟件工程師的職位,面試官讓很多候選人三人一組討論去設(shè)計一款ATM機,當時我們那組討論的熱火朝天,什么把Linux操作系統(tǒng)內(nèi)核移植過來,加入互鎖機制確保取錢的安全性,什么多線程加快速度等等天馬行空的方案。最終默默地在等待Offer,就一直默默而無下文了?,F(xiàn)在站在大廠的角度想一想,可能是通過一些試題想考察你對一個項目的軟件思維能力。啥叫軟件思維能力。就是從軟件的角度去解讀需求。別囫圇吞棗,大而空地泛泛之談。你能想得越細,設(shè)計的代碼覆蓋的case越多,設(shè)計的代碼簡單且RAM,ROM越節(jié)省,執(zhí)行效率越高,這才是去做嵌入式軟件工程師的正確解法。我們從狀態(tài)機的角度去分析一下解題步驟:

  • 全面詳盡的弄清楚客戶的需求,分解成相應(yīng)的功能或多個子功能需求
  • 弄清楚這些功能中的狀態(tài),并確定狀態(tài)的轉(zhuǎn)移條件(及狀態(tài)的進入和退出條件或事件),設(shè)計出系統(tǒng)的狀態(tài)骨架
  • 測試每個轉(zhuǎn)移的有效性
  • 針對每個狀態(tài),結(jié)合功能需求細化狀態(tài)中需要做哪些事情
  • 集成進行系統(tǒng)的集成測試

ATM狀態(tài)機

當您設(shè)計ATM 的功能時,設(shè)想一下你是小明。小明走到ATM機面前,一系列的事件(事件是指在某個時刻發(fā)生的事情 )發(fā)生了,插入卡片(Card_Insert_Event),輸入密碼(Pin_Enter_Even),選擇辦理事項(Option_Selection_Event:取錢/存錢/查詢余額),輸入數(shù)額(Amount_Enter_Event)并按確認,ATM吐出所需錢財(Amount_Dispatch_Event)。如下圖為從ATM取錢的一個狀態(tài)機模型, 描述了ATM狀態(tài)及轉(zhuǎn)移條件。

狀態(tài)作為系統(tǒng)的一種特定階段的狀態(tài),則會持續(xù)一段時間,直到特定的觸發(fā)事件導(dǎo)致狀態(tài)的轉(zhuǎn)移的特定點為止。例如夜深人靜的時候ATM大概率處于空閑狀態(tài)。過節(jié)的時候(是蠻多和女生相關(guān)的且需要花錢的節(jié)日的),你走到ATM插入卡片后的那個時間點,ATM從空閑狀態(tài)切換到了檢測到卡片插入狀態(tài)。

對事件發(fā)生所執(zhí)行的事件處理是當前狀態(tài)和輸入事件的一個函數(shù)。此處的名字叫做EventHandle, 還可叫做Action(有三類:entry,during,exit)。其可存在轉(zhuǎn)移的分支上,或者是位于狀態(tài)的進入或退出動作或during標簽中,如下圖所示。

  • entry: 當進入一個狀態(tài)的時候執(zhí)行該標簽下的action,該action在狀態(tài)中其它任何action之前執(zhí)行。
  • during: 當狀態(tài)處于激活時執(zhí)行during 標簽下的action , during活動在進入活動之后執(zhí)行,并且—直運行到它本身完成為止(同步執(zhí)行的動作)。
  • exit: 當離開—個狀態(tài)的時候觸發(fā)執(zhí)行該標簽下的action,該活動在該狀態(tài)結(jié)束之前并且所有其它action都完成后觸發(fā)執(zhí)行。

一般狀態(tài)之間的轉(zhuǎn)換不僅依賴于Event的發(fā)生,還需要[Condition Expression]這個門控條件成立,才能發(fā)生轉(zhuǎn)移。如下圖中的轉(zhuǎn)移的方式:轉(zhuǎn)移條件分別為Condition和Event。

狀態(tài)機實現(xiàn)方式

如果你用C語言建模的話,一般推薦下面兩種方式

  • 實現(xiàn)方式1:switch-case結(jié)構(gòu)。
    實現(xiàn)方式簡單,Case變多的時候不易維護,并且圈復(fù)雜度較高。
#include <stdio.h>
//Different state of ATM machine
typedef enum
{
    Idle_State,
    Card_Inserted_State,
    Pin_Eentered_State,
    Option_Selected_State,
    Amount_Entered_State,
} eSystemState;
//Different type events
typedef enum
{
    Card_Insert_Event,
    Pin_Enter_Event,
    Option_Selection_Event,
    Amount_Enter_Event,
    Amount_Dispatch_Event
} eSystemEvent;
//Prototype of eventhandlers
eSystemState AmountDispatchHandler(void)
{
    return Idle_State;
}
eSystemState EnterAmountHandler(void)
{
    return Amount_Entered_State;
}
eSystemState OptionSelectionHandler(void)
{
    return Option_Selected_State;
}
eSystemState EnterPinHandler(void)
{
    return Pin_Eentered_State;
}
eSystemState InsertCardHandler(void)
{
    return Card_Inserted_State;
}
int main(int argc, char *argv[])
{
    eSystemState eNextState = Idle_State;
    eSystemEvent eNewEvent;
    while(1)
    {
        //Read system Events
        eSystemEvent eNewEvent = ReadEvent();
        switch(eNextState)
        {
        case Idle_State:
        {
            if(Card_Insert_Event == eNewEvent)
            {
                eNextState = InsertCardHandler();
            }
        }
        break;
        case Card_Inserted_State:
        {
            if(Pin_Enter_Event == eNewEvent)
            {
                eNextState = EnterPinHandler();
            }
        }
        break;
        case Pin_Eentered_State:
        {
            if(Option_Selection_Event == eNewEvent)
            {
                eNextState = OptionSelectionHandler();
            }
        }
        break;
        case Option_Selected_State:
        {
            if(Amount_Enter_Event == eNewEvent)
            {
                eNextState = EnterAmountHandler();
            }
        }
        break;
        case Amount_Entered_State:
        {
            if(Amount_Dispatch_Event == eNewEvent)
            {
                eNextState = AmountDispatchHandler();
            }
        }
        break;
        default:
            break;
        }
    }
    return 0;
}

  • 實現(xiàn)方式2:查表方式
    易于維護,可以方便你增加新的狀態(tài)或事件。減少代碼的長度,通過函數(shù)指針和事件及狀態(tài)進行綁定,非要說個缺點就是使用了指針,在汽車Misra C標準中不太推薦使用指針。
#include <stdio.h>
//Different state of ATM machine
typedef enum
{
    Idle_State,
    Card_Inserted_State,
    Pin_Eentered_State,
    Option_Selected_State,
    Amount_Entered_State,
    last_State
} eSystemState;
//Different type events
typedef enum
{
    Card_Insert_Event,
    Pin_Enter_Event,
    Option_Selection_Event,
    Amount_Enter_Event,
    Amount_Dispatch_Event,
    last_Event
} eSystemEvent;
//typedef of function pointer
typedef eSystemState (*pfEventHandler)(void);
//structure of state and event with event handler
typedef struct
{

    eSystemState eStateMachine;
    eSystemEvent eStateMachineEvent;
    pfEventHandler pfStateMachineEvnentHandler;
} sStateMachine;
//function call to dispatch the amount and return the ideal state
eSystemState AmountDispatchHandler(void)
{
    return Idle_State;
}
//function call to Enter amount and return amount entered state
eSystemState EnterAmountHandler(void)
{
    return Amount_Entered_State;
}
//function call to option select and return the option selected state
eSystemState OptionSelectionHandler(void)
{
    return Option_Selected_State;
}
//function call to enter the pin and return pin entered state
eSystemState EnterPinHandler(void)
{
    return Pin_Eentered_State;
}
//function call to processing track data and return card inserted state
eSystemState InsertCardHandler(void)
{
    return Card_Inserted_State;
}
//Initialize array of structure with states and event with proper handler
sStateMachine asStateMachine [] =
{
    {Idle_State,Card_Insert_Event,InsertCardHandler},
    {Card_Inserted_State,Pin_Enter_Event,EnterPinHandler},
    {Pin_Eentered_State,Option_Selection_Event,OptionSelectionHandler},
    {Option_Selected_State,Amount_Enter_Event,EnterAmountHandler},
    {Amount_Entered_State,Amount_Dispatch_Event,AmountDispatchHandler}
};
//main function
int main(int argc, char *argv[])
{
    eSystemState eNextState = Idle_State;
    while(1)
    {
        //Api read the event
        eSystemEvent eNewEvent = read_event();
        if((eNextState < last_State) && (eNewEvent < last_Event)&& (asStateMachine[eNextState].eStateMachineEvent == eNewEvent) && (asStateMachine[eNextState].pfStateMachineEvnentHandler != NULL))
        {
            // function call as per the state and event and return the next state of the finite state machine
            eNextState = (*asStateMachine[eNextState].pfStateMachineEvnentHandler)();
        }
        else
        {
            //Invalid
        }
    }
    return 0;
}


往期鏈接:

UDS診斷看這篇就夠了,吐血整理

AUTOSAR診斷通信棧簡介

Diagnosis about DEM module

Memory 的介紹1

功能安全之看門狗WDGM 介紹

AUTOSAR ASILD級別安全軟件模塊的安全機制介紹

基于Autosar軟件的功能安全開發(fā)的介紹

AUTOSAR模式管理經(jīng)驗總結(jié)

AURIX GTM 輸出模塊(TOM)

使用AURIX TOM模塊生成交流電機的PWM驅(qū)動

AUTOSAR OS分析概述

OS-Protection   -Timing Protection

Autosar OS (2)

Autosar OS 介紹


關(guān)注微信公眾號『糖果Autosar』,后臺回復(fù)“資料”查看更多內(nèi)容,回復(fù)“加群”加入汽車電子與AUTOSAR技術(shù)交流群。

                      

,

免責聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設(shè)備,其驅(qū)動電源的性能直接關(guān)系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅(qū)動電源設(shè)計中至關(guān)重要的兩個環(huán)節(jié),集成化方案的設(shè)計成為提升電機驅(qū)動性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設(shè)備的使用壽命。然而,在實際應(yīng)用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設(shè)計、生...

關(guān)鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術(shù)之一是電機驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅(qū)動系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動汽車的動力性能和...

關(guān)鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設(shè)中,街道及停車場照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設(shè)計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關(guān)鍵字: LED 驅(qū)動電源 開關(guān)電源

LED驅(qū)動電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動電源
關(guān)閉