<dfn id="is4kg"></dfn>
  • <ul id="is4kg"></ul>
  • <abbr id="is4kg"></abbr>
  • <ul id="is4kg"></ul>
    <bdo id="is4kg"></bdo>
    以文本方式查看主題

    -  曙海教育集團(tuán)論壇  (http://www.hufushizhe.com/bbs/index.asp)
    --  C語言開發(fā)  (http://www.hufushizhe.com/bbs/list.asp?boardid=62)
    ----  ELF 程序開發(fā)教程及技術(shù)討論專貼  (http://www.hufushizhe.com/bbs/dispbbs.asp?boardid=62&id=2400)

    --  作者:wangxinxin
    --  發(fā)布時(shí)間:2010-12-10 11:07:00
    --  ELF 程序開發(fā)教程及技術(shù)討論專貼
    西門子x65/x75上的 ELF 程序大家已經(jīng)見識(shí)過了,你有沒想過寫出自己的 ELF 程序呢?如果你有C語言基礎(chǔ),那么加入 ELF 程序開發(fā)的隊(duì)伍吧。
    要在西門子x65/x75上使用 ELF 程序,你應(yīng)該確定自己的機(jī)器上正確的刷了適合你機(jī)型的3個(gè)補(bǔ)丁(如下):
    function library
    elfloader
    swi-hook
    查看機(jī)型在待機(jī)下輸入 *#06# 選更多,sW-Version一行就是了
    現(xiàn)在的 ELF 程序一般是被刷過以上3個(gè)補(bǔ)丁的正確版本的機(jī)器所通用的(也有可能會(huì)限制機(jī)型,看程序怎么寫的了8-) )
    下面進(jìn)入正題

    目錄:
    1.IAR SI 安裝
    2.在手機(jī)上運(yùn)行 ELF 程序

    3.如何用 IAR 編寫 ELF
    4.例1:內(nèi)存和文件的操作
    5.例2:屏幕輸出和鍵盤控制
    6.例3:一個(gè)后臺(tái)計(jì)時(shí)的小程序
    7.例4:內(nèi)存駐留程序
    8.FAQ


    1.IAR SI 安裝
    www.iar.com下載 IAR Embedded Workbench  For ARM 的30天試用版,最新版為4.41好象(>100 mb),程序下載是免費(fèi)的,但是會(huì)要你先注冊(cè)。填寫正確的油箱以后,就會(huì)把使用序列號(hào)發(fā)給你。安裝沒說的了吧,一路下一步,下一步,等等。

    2.在手機(jī)上運(yùn)行 ELF 程序
    論壇上很多說明了,再扯就遠(yuǎn)了點(diǎn):-\')

    3.如何用 IAR 編寫 ELF
    開始一個(gè) ELF 程序的編寫,還是比較簡(jiǎn)單 :P
    在菜單上選擇 “Project->Create New Project”
    然后選添加"Project->Add Files"把你用其他IDE寫好的C程序添加進(jìn)來就可以了
    工程必須還要有 func.asm (入口點(diǎn)) 和 div.r79 (這個(gè)好象莫必要?我也不太清楚,我是業(yè)余的:( )
    C程序知道怎么寫,問題就不大。
    你可能會(huì)問,怎么使用到手機(jī)里面那些需要的功能函數(shù)呢?這就需要 swilib.h 這個(gè)頭文件了(附件提供),這里面定義了n多函數(shù),大家看名字猜吧。。。因?yàn)闆]說明,滅辦法,唉。
    上面的操作做好以后,就可以編譯我們的程序了,在 IAR 環(huán)境里左邊的 Workspace 下面,把 Debug 選成 Release,然后在工程上點(diǎn)右鍵,選屬性 CPU 可以不用改,下面的 Processor mode 改為 Arm,在 Library Configuration 標(biāo)簽里,把 Library 選成 None,就可以編譯了。這里你也可以在 Linker 里面設(shè)置相關(guān)連接選項(xiàng)。生成完畢后,你就可以在 你的工程\\Release\\Exe 目錄里找到生成的 ELF 文件,放到手機(jī)里看看呢?:P

    4.例1:內(nèi)存和文件的操作
    創(chuàng)建 main.c 如下后添加到你的工程里:
    //main.c
    #include "swilib.h"
    void ElfKiller(void) { //用于 elf 退出時(shí)的相關(guān)操作
        extern void *ELF_BEGIN;
        //這里一般使用 mfree(), freeWS() 來釋放內(nèi)存
        ((void (*)(void *))(mfree_adr()))(ELF_BEGIN); // 懶得解釋 :(
    }
    int main(char *exename, char *fname) { //主函數(shù)
    //參數(shù) exename 表示被動(dòng)使用的ELF? 格式 4:\\Zbin\\xyz.elf
    //參數(shù) fname 傳遞文件名, 格式 0:\\Misc\\data.txt
    //如果 ELF 啟動(dòng)自身則為 0
        char *mem;
        int i, err;
        int handle;
        if (fname) {
            //操作標(biāo)準(zhǔn)文件:
            handle = fopen(fname, A_ReadWrite+A_BIN+A_Append+A_Create, P_READ+P_WRITE, err);
            //表示按記錄文件打開,數(shù)據(jù)添加到文件末尾,如果文件不存在則創(chuàng)建之
            //如果為 handle=fopen (fname,A_ReadOnly+A_BIN, 0,err);
            //則表示按只讀方式打開文件,具體常數(shù)參看 swilib.h
            if (handle != -1) { //-1 = error
                mem = malloc(10000); //分配內(nèi)存: AllocWS() 按行分配 (2b)
                if (mem != 0) { //0 = error
                    i = fread(handle, mem, 10000, err); //返回讀取得字節(jié)數(shù),如果錯(cuò)誤返回 error。
                    //放置你的代碼在這里 makesomebody (mem,i);
                    fwrite(handle, mem, i, err);
                    mfree(mem); //釋放內(nèi)存: FreeWS() 按行釋放
                }
                fclose(handle); //關(guān)閉文件
            }
        }
        SUBPROC((void *)ElfKiller); //放這個(gè)東西在這里就最好了,不存在也沒關(guān)系!
        return(0);
    }
    //PS. 由于 x65 中文件的讀取和記錄是按 32767 字節(jié)的塊操作的,
    //因此將 fread() 和 fwrite() 改造為 fread32 () 和 fwrite32()
    int fread32(int fh, char *buf, int len, unsigned int *err) { // (c) Rst7
        int clen;
        int rlen;
        int total=0;
        while (len) {
            if (len > 16384) clen = 16384; else clen = len;
            total += (rlen = fread(fh, buf, clen, err));
            if (rlen != clen) break;
            buf += rlen;
            len -= clen;
        }
        return(total);
    }

    最后不要忘了還有 func.asm 這個(gè)文件:
    ;Func.asm
        PUBLIC ELF_BEGIN
        RSEG ELFBEGIN:DATA
    ELF_BEGIN
    defadr MACRO a,b
       PUBLIC a
    a EQU b
       ENDM
       END

    5.例2:屏幕輸出和鍵盤控制
    通過導(dǎo)航鍵控制屏幕上的符號(hào)移動(dòng),長按紅鍵退出。本例子基于 TED- A (c) Of rst7
    看本例時(shí)最好從下往上看:)

    創(chuàng)建 main.c 如下后添加到你的工程里:
    //main.c
    //屏幕和鍵盤處理
    #include "swilib.h"
    typedef struct {
        GUI gui;
        //WSHDR *ws1;
        //WSHDR *ws2;
        //int i1;
    } MAIN_GUI;
    typedef struct {
        CSM_RAM csm;
        int gui_id;
    } MAIN_CSM;
    const int minus11 = -11;
    const unsigned int INK = 0;
    const unsigned int PAPER = 1;
    volatile int xx = 0, yy = 0; //繪圖坐標(biāo)
    const char bmp[12] = {0xFC, 0x86, 0xB3, 0xA9, 0xB1, 0xA9, 0x81, 0xFF, 0, 0, 0, 0};
    const IMGHDR img = {8, 12, 0x1, 0, (char *)bmp};
    //============
    //屏幕輸出
    //============
    void DrwImg(IMGHDR *img, int x, int y, int *pen, int *brush)  {
        RECT rc;
        DRWOBJ drwobj;
        StoreXYWHtoRECT(rc, x, y, img->w, img->h);
        SetPropTo_Obj5(drwobj, &rc, 0, img);
        SetColor(drwobj, pen, brush);
        DrawObject(drwobj);
    }
    void DrawScreen(void) {
        int *ink = GetPaletteAdrByColorIndex(INK);
        int *paper = GetPaletteAdrByColorIndex(PAPER);
        int x = xx;
        DrwImg((IMGHDR *)img, x, yy, ink, paper);
    }
    //繪制屏幕
    void method0(MAIN_GUI *data) {
        DrawScreen();
    }
    void method1(MAIN_GUI *data, void *(*malloc_adr)(int)) {}
    void method2(MAIN_GUI *data, void (*mfree_adr)(void *)) {}
    void method3(MAIN_GUI *data, void *(*malloc_adr)(int), void (*mfree_adr)(void *)) {}
    void method4(MAIN_GUI *data, void (*mfree_adr)(void *)) {}
    void method7(MAIN_GUI *data, void (*mfree_adr)(void *)) {}
    int method8(void) {return(0);}
    int method9(void) {return(0);}
    //============
    //按鍵控制
    //============
    int method5 (MAIN_GUI *data, GUI_MSG *msg) {
        //if (msg->gbsmsg->msg==KEY_UP) //釋放按鍵時(shí)
        if ((msg->gbsmsg->msg == KEY_DOWN) || (msg->gbsmsg->msg == LONG_PRESS)) //按下鍵或者長按鍵時(shí)
            switch(msg->gbsmsg->submess) {
            case RED_BUTTON:
                return(1); //發(fā)生 generalFunc 流調(diào)用 GUI - > 關(guān)閉 GUI
            case UP_BUTTON:
                if (yy > 0) --yy; break;
            case LEFT_BUTTON:
                if (xx > 0) --xx; break;
            case DOWN_BUTTON:
                if (yy < 130) ++yy; break;
            case RIGHT_BUTTON:
                if ( xx < 120) ++xx; break;
            //case GREEN_BUTTON:
            //case RIGHT_SOFT:
            //case ENTER_BUTTON:
            //case LEFT_SOFT:
            //case VOL_UP_BUTTON:
            //case VOL_DOWN_BUTTON:
            //case \'0\':
            //case \'9\':
            //case \'#\':
            //SUBPROC((void *)DoDiskAccess,1);
            //降低其他處理的優(yōu)先級(jí)以繪制窗口
            }
        DrawScreen();
        return(0);
    }
    const void *const gui_methods[11] = {
        (void *)method0, //Redraw
        (void *)method1, //Create
        (void *)method2, //Close
        (void *)method3, //Focus
        (void *)method4, //Unfocus
        (void *)method5, //OnKey
        0,
        (void *)method7, //Destroy
        (void *)method8,
        (void *)method9,
        0
    };
    const RECT Canvas={0,0,131,175};
    void maincsm_oncreate(CSM_RAM *data) {
        MAIN_GUI *main_gui = malloc(sizeof (MAIN_GUI));
        MAIN_CSM *csm = (MAIN_CSM *)data;
        zeromem(main_gui, sizeof (MAIN_GUI));
        //ustk=malloc(STKSZ); //為程序分配內(nèi)存
        //info_ws=AllocWS(512);
        main_gui->gui.canvas = (void *)(Canvas);
        main_gui->gui.flag30 = 2;
        main_gui->gui.methods = (void *)gui_methods; //基本方法(見上面)
        main_gui->gui.item_ll.data_mfree = (void (*)(void *))mfree_adr(); //我也不清楚:(
        csm->csm.state = 0;
        csm->csm.unk1 = 0;
        csm->gui_id = CreateGUI(main_gui); //直接創(chuàng)建 GUI
    }
    void Killer(void) { //退出程序
        extern void *ELF_BEGIN;
        //mfree(ustk); //釋放內(nèi)存
        //FreeWS(info_ws);
        ((void (*)(void *))(mfree_adr()))(ELF_BEGIN);
    }
    void maincsm_onclose(CSM_RAM *csm) {
        //GBS_StopTimer(light_tmr);
        SUBPROC((void *)Killer);
    }
    int maincsm_onmessage(CSM_RAM *data, GBS_MSG *msg) {
        return(1);
    }
    unsigned short maincsm_name_body[140];
    const struct {
        CSM_DESC maincsm;
        WSHDR maincsm_name;
    } MAINCSM = {
                    {
                        maincsm_onmessage, //信息進(jìn)程
                        maincsm_oncreate, //創(chuàng)建時(shí)調(diào)用的方法
                        //如果機(jī)型為 S75 移除以下4行
                        //并在 swilib.h 里取消對(duì) #define NEWSGOLD 這行的注釋
                        //0,
                        //0,
                        //0,
                        //0,
                        maincsm_onclose, //關(guān)閉時(shí)調(diào)用的方法
                        sizeof (MAIN_CSM),
                        1,
                        minus11
                    },
                    {
                        maincsm_name_body,
                        NAMECSM_MAGIC1,
                        NAMECSM_MAGIC2,
                        0x0,
                        139
                    }
                };
    int main(char *exename, char *fname) {
        char dummy[sizeof (MAIN_CSM)];
        //strcpy(filename,fname); //保存數(shù)據(jù)到文件
        CreateCSM(MAINCSM.maincsm, dummy, 0);
        return 0;
    }

    主站蜘蛛池模板: 日日碰狠狠添天天爽爽爽| 精品香蕉在线观看免费| 对白脏话肉麻粗话视频| 亚洲av福利天堂一区二区三| 爱情论坛免费在线看| 国产人妖一区二区| 97无码免费人妻超级碰碰夜夜| 少妇一晚三次一区二区三区| 亚欧免费无码aⅴ在线观看| 欧美精品综合一区二区三区| 哦┅┅快┅┅用力啊┅┅动态图| 香蕉视频在线免费| 国产黄网在线观看| 中文乱码人妻系列一区二区| 日本成人免费在线观看| 亚洲成人在线电影| 波多野结衣和乡下公在线观看| 国产一区三区二区中文在线| 120秒男女动态视频免费| 天天想你在线视频免费观看| 久久久亚洲欧洲日产国码二区| 日韩高清国产一区在线| 亚洲色图激情文学| 精品brazzers欧美教师| 国产人妖xxxx做受视频| 2019国产精品| 国内揄拍高清国内精品对白| 中文字幕亚洲一区二区三区| 精品福利视频一区二区三区| 国产男女爽爽爽爽爽免费视频| japanesexxxx乱子老少配另类| 日韩人妻无码中文字幕视频| 亚洲精品动漫在线| 瓮红电影三级在线播放| 国产chinesehd精品酒店| 青青草国产精品视频| 国产精品无码久久综合网| www..com色| 娇妻第一次被多p| 久久久久国产精品| 日本无遮挡h肉动漫在线观看下载|