在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 中斷調(diào)用方式的ARM二次開發(fā)接口設(shè)計

            中斷調(diào)用方式的ARM二次開發(fā)接口設(shè)計

            作者: 時間:2013-11-11 來源:網(wǎng)絡(luò) 收藏
            中斷調(diào)用方式的ARM二次開發(fā)接口設(shè)計
            圖4 基于GNU工具鏈的開發(fā)模式圖
              這里選用EABI版本,其基本操作命令如表1所列。CortexM3內(nèi)核在地址0x00000000處存放一個向量表,向量表的第0個單元即地址0x00000000處存放的是堆棧頂?shù)牡刂?。CortexM3復(fù)位后即從該處取出數(shù)據(jù),用以初始化MSP寄存器。向量表中的內(nèi)容是32位的地址,這些地址是異常服務(wù)程序的入口地址,其中向量表的第一個單元即地址0x00000004處存放的是復(fù)位向量,也就是說CortexM3復(fù)位后,執(zhí)行該向量(可理解為函數(shù)指針)指向的復(fù)位代碼[4],代碼如下:
            __attribute__ ((section(".stackarea")))
            static unsigned long pulStack[STACK_SIZE];
            表1 win20080331 GNU 工具鏈的命令名稱
            中斷調(diào)用方式的ARM二次開發(fā)接口設(shè)計
              這一句定義了一個pulStack數(shù)組,程序把這個數(shù)組作為了堆棧區(qū)。這條語句使用了__attribute__ ((section(".stackarea"))),把數(shù)組定位在了.stackarea這個段中。
            typedef void (* pfnISR)(void);
            __attribute__ ((section(".isr_vector")))
            pfnISR VectorTable[]={
              (pfnISR)((unsigned long)pulStack + sizeof(pulStack)),
              ResetISR, //初始化堆棧
              NMIException, //復(fù)位句柄
              HardFaultException
            };
              定義了一個數(shù)組VectorTable,作為向量表,定位于.isr_vector段中。通過鏈接腳本的控制,這個表將放在正文區(qū)的最開始,正文區(qū)又將從Flash開始存放,這樣這個向量表就會起到存放在0x00000000開始的地址空間的效果。向量表的第0個單元是((unsigned long)pulStack+sizeof(pulStack)),這是數(shù)組的最后一個元素,因為CortexM3的堆棧是向下增長的。 向量表的第1個單元是ResetISR,它指向復(fù)位處理的代碼也是整個程序的入口。本程序用它來實現(xiàn)啟動代碼的功能。
            extern unsigned long _etext;
            extern unsigned long _data;
            extern unsigned long _edata;
            extern unsigned long _bss;
            extern unsigned long _ebss;
            void ResetISR(void){
              unsigned long *pulSrc, *pulDest; //將保存于Flash中的初始化數(shù)據(jù)復(fù)制到SRAM中
              pulSrc=_etext;
              for(pulDest=_data; pulDest _edata;){
                *pulDest++=*pulSrc++;
                } // 將.bss段清零
              for(pulDest=_bss; pulDest_ebss;){
                *pulDest++=0;
              }
              main(); //最后調(diào)用main進(jìn)入主程序
            }
              這段代碼用到了通過連接器賦值的幾個變量值。_etext的值為正文段結(jié)尾處的地址,這之后的Flash空間是初始化的數(shù)據(jù)值,應(yīng)該復(fù)制到SRAM中去。_data、_edata的值分別為數(shù)據(jù)段的開始和結(jié)尾處的地址,這部分應(yīng)該是SRAM的地址。
              這部分代碼的主要功能就是將保存于Flash中的初始化數(shù)據(jù)復(fù)制到SRAM中。然后將.bss段清零。最后調(diào)用main進(jìn)入到我們的主程序。
            3.2 Gcc二次開發(fā)接口設(shè)計中的關(guān)鍵技術(shù)點
            (1) 連接器中SysCallLib地址的賦值
              連接器所做的工作簡單地講就是把所有目標(biāo)文件相應(yīng)的段連接到一起,并把目標(biāo)文件中的“變量地址”、“函數(shù)地址”重新定位至正確的地址空間。通過在SECTIONS段中添加函數(shù)PROVIDE來聲明函數(shù)地址,代碼如下:
            SECTIONS{
              PROVIDE(SysCallLib= 0x08005935);
              /*對于Cortex器件來說,啟動代碼的開始段VectorTable一般存儲在.isr_vector段中*/
              .isr_vector :{
                . =ALIGN(4);
                KEEP(*(.isr_vector)) /*啟動代碼*/
                . = ALIGN(4);
              } >FLASH
            }
            (2) 用戶程序Flash空間和SRAM空間的設(shè)定
              對于STM32系列芯片來說向量表、.text和.rodata就應(yīng)該放到從0x08000000開始的Flash、.data、.bss和堆棧,就應(yīng)該定位至從0x20000000開始的SRAM中。 但是對于用戶程序,這些地址空間都需要重新設(shè)定。這些定位都可以通過鏈接腳本進(jìn)行控制。
            MEMORY{
              FLASH(rx) :
              ORIGIN=0x08000000, LENGTH=0x20000
              SRAM (rwx):
              ORIGIN=0x20000000, LENGTH=0x5000
            }
              這些語句說明了Flash和SRAM開始的地址以及大小。只需要修改這里,ORIGIN的值即可改變用戶程序存儲的物理地址,通過修改LENGTH來修改空間大小。
            (3) SysCallLib函數(shù)的編寫
              SysCallLib函數(shù)在系統(tǒng)程序中進(jìn)行編寫,主要通過Case語句來實現(xiàn)跳轉(zhuǎn)。形式如下:
              void SysCallLib(unsigned int Index, int *Ret, unsigned char Argc, unsigned int Arg[]);
              通過函數(shù)的參數(shù)來判斷需要調(diào)用的系統(tǒng)函數(shù)。通過把SysCallLib函數(shù)作為過渡函數(shù)來為用戶編寫全新的API函數(shù),用戶使用起來更加方便,以LCD顯示圖片的函數(shù)為例,代碼如下:
            void mLCD_DisplayImage(unsigned char x, unsigned char y, const unsigned char *ImagePt, unsigned char ImageXSize, unsigned char ImageYSize ){
              int RetVal;
              unsigned int Arg[5];
              unsigned char Argc=5;
              Arg[0]=x;
              Arg[1]=y;
              Arg[2]=(unsigned int)ImagePt;
              Arg[3]=ImageXSize;
              Arg[4]=ImageYSize;
              SysCallLib(_SYSCALL_LCD_DIS_IMAGE, RetVal, Argc, Arg);
            }
              用戶只需調(diào)用簡單的API函數(shù)mLCD_DisplayImage即可在LCD上顯示圖片。

            c語言相關(guān)文章:c語言教程



            上一頁 1 2 下一頁

            關(guān)鍵詞: ARM Funtion 中斷

            評論


            相關(guān)推薦

            技術(shù)專區(qū)

            關(guān)閉