新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > LIN協議驅動器的關鍵技術及設計原理

        LIN協議驅動器的關鍵技術及設計原理

        作者: 時間:2014-03-19 來源:網絡 收藏

        3 應用層:

        應用層主要實現報文信號訪問及通信管理。

        3.1 信號訪問

        首先為每個報文的數據場根據信號在場中的位置及長度設計相應的結構體,然后以結構體成員變量的方式對信號進行訪問。以與本節點通信的一個陽光傳感器所發報文為例,場長度為l_SunSensLen=4,其信號包括陽光采樣值、大燈操作請求、小燈操作請求等,場結構體如下所示:

        typedef struct

        {

        l_bool l_ss_sshealth:1;

        l_u8 l_ss_headlampreq:2;

        l_bool l_ss_poslampreq:2;

        l_u8 :3;

        l_u8 l_ss_ssvalue:8;

        l_u8 l_ss_headlampswth:8;

        l_bool l_ss_sserror:1;

        l_u8 :3;

        l_u8 l_ss_ssmsgcounter:4;

        }l_ss_msgType;

        為了使用的方便,定義聯合體如下:

        typedef union

        {

        l_u8 data[l_SunSensLen];

        l_ss_msgType sunsens;

        }l_ss_msgBuf;

        為該報文數據場定義全局變量 l_ss_msgBuf l_SunSens;采取“不帶復制的訪問方式”5,直接對信號賦值和取值,如對l_SunSens.sunsens.l_ss_headlampreq進行讀寫便實現了對大燈操作請求信號的訪問。之所以采取這種方式,是因為采用調度表方式的報文周期固定,信號變化的速度為調度表長度的整數倍,對于應用而言,基本為百毫秒的量級,應用程序對LIN信號數據的訪問速度遠大于這個變化速度,即在數據產生變化之前已經被訪問了,這種方式簡單直觀而且節省了變量空間。

        3.2 通信管理

        LIN通信采用時間片輪轉的方式調度通信,調度表管理是通信管理的核心,下面先給出調度表條目的數據結構:

        typedef struct

        {

        uchar handle;

        uchar pid;

        l_Resp_mode mode;

        uchar datalen;

        uchar *data;

        uchar ticks;

        }l_sch_table_item;

        調度表為l_sch_table_item結構體數組,pid表示該條目對應哪一個報文,mode表示本節點發送還是接收該數據場,*data為該報文數據場結構體的地址,ticks為該時間槽的長度,在對調度表數組進行初始化時,將報文數據場結構體變量的地址賦給調度表條目中的*data,這樣便實現了訪問方式一節中的“不帶復制的訪問方式”。調度表是一個環形的序列,調度到表尾則切換到表頭繼續輪轉,調度表的輪轉函數如下所示:

        void l_sch_tick(void)

        {

        if(1==TM[LIN_TIMESLOT_MS].overflow_flag){

        TM[LIN_TIMESLOT_MS].overflow_flag=0;

        if(Cur_sch_item==l_sch_table_main[l_MAIN_SLOTS-1]){

        Cur_sch_item=l_sch_table_main;

        }else{

        Cur_sch_item++;

        }

        Cur_frame.state=l_IDLE;

        Cur_frame.done=0;

        Cur_frame.error=0;

        if(Cur_sch_item->pid!=l_Freepid){

        l_SendBreak();

        }else{

        ;

        }

        TimerStart(LIN_TIMESLOT_MS,Cur_sch_item->ticks,0,1);

        }

        }

        應用層功能還包括休眠和喚醒功能,在此不再贅述。

        結語

        本文實現的LIN模塊可以方便得集成到應用程序中,并且獨立于具體的處理器和所采用的操作系統,可移植性良好,具有很好的實用價值和借鑒意義。


        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 炎陵县| 盐山县| 平塘县| 侯马市| 习水县| 郑州市| 虞城县| 色达县| 腾冲县| 水富县| 佛冈县| 兴文县| 拉孜县| 高雄县| 禄丰县| 汝阳县| 额济纳旗| 鄂尔多斯市| 汪清县| 进贤县| 阳泉市| 沿河| 新乡县| 河东区| 定安县| 班玛县| 桐乡市| 边坝县| 衡阳县| 旬阳县| 邢台市| 临安市| 宾川县| 社会| 安陆市| 常德市| 霍邱县| 固阳县| 武乡县| 武定县| 商水县|