新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于xilkernel的嵌入式應用程序設計方法

        基于xilkernel的嵌入式應用程序設計方法

        作者: 時間:2011-12-23 來源:網絡 收藏

          這樣,系統會發起important_task和second_important_task兩個任務,important_task的優先級比second_important_task高,會優先運行。除非important_task任務阻塞或退出,second_important_task才可能得到運行。

          posix無名信號量

          信號量提供高速的任務間同步和互斥機制。對于互斥,信號量可以上鎖共享資源,使得該共享資源在同一時刻只有一個線程所擁有。關于此信號量的一些常用函數如下:

          intsem_init(sem_t*sem,intpshared,unsignedintvalue);
        intsem_wait(sem_t*sem);
        intsem_post(sem_t*sem);

          sem_init()創建一個信號量,并初始化信號量的值為value;sem_wait()調用將阻塞進程,直到信號量的值大于0,此函數返回時信號量的值減1;sem_post()是將信號量的值加1,并發出信號喚醒等待的進程。

          信號量用于同步,一般要初始化為0,等待要同步的任務阻塞在sem_wait()調用上。任務調用sem_post來解鎖該信號量,來達到同步。下面一個例子是用信號量實現同步操作的:

        staticsem_tprotect;
        void*first_thread(){......
        sem_init(protect,1,0);
        ......
        }
        void*thread_func1(){......
        while(1){
        sem_wait(protect);
        ......
        }
        }
        void*thread_func2(){......
        while(1){......
        if(某種條件成立)sem_post(protect);
        }
        }

          當信號量用于互斥時,一般要初始化為一個大于0的值,就可以讓資源可用。如果信號量的初始值為1,第一個上鎖該信號量的線程會立即執行,后繼的線程將會阻塞,直到下次信號量解鎖才會執行。

          xsi消息隊列

          消息隊列允許長度可變、數目可變的消息排隊。任何任務或中斷服務程序可以發送消息到消息隊列。任何任務可從消息隊列接收消息。關于此消息隊列的一些常用函數如下:

          intmsgget(key_tkey,intmsgflg)
        intmsgsnd(intmsqid,constvoid*msgp,size_tmsgsz,intmsgflg)
        ssize_tmsgrcv(intmsqid,void*msgp,size_tnbytes,longmsgtyp,intmsgflg)

          msgget()來創建一個消息隊列,key是消息隊列的標識符,msgflag目前有兩個選項,ipc_creat和ipc_excl。msgsnd()函數往隊列發送一條消息,msgp是消息緩沖指向的指針,msgsz表示消息的字節數。msgrcv()函數作用是從消息隊列中讀取消息,把接收到的消息拷貝到msgp指針指向的緩沖區,nbytes表示緩沖支持的消息字節數。發送和接收消息中的msqid是消息隊列描述符,用來標識相關的消息隊列。下面是消息隊列單向通信的簡單代碼:

        struct_msg{
        shorttype;
        charfirst;
        charlast;
        };
        staticstruct_msgmsg_p;
        staticstruct_msgmsg_c;
        staticintmsgid;
        void*first_thread(){......
        msgid=msgget(5,ipc_creat|ipc_excl);
        ......
        }
        void*consumer()
        {
        while(1){
        msgrcv(msgid,msg_c,4,0,0);
        ......
        }
        }
        void*producer()
        {
        while(1){......
        msgsnd(msgid,msg_p,4,0);
        }
        }

          在例子開始,建立消息的數據結構。在producer()中操作消息的各項數據,通過msgsnd()發送此消息。在consumer()中,如果消息隊列里沒有消息,則msgsnd()阻塞此線程,直到消息隊列非空時,msgsnd()才把消息復制到msg_p指向的數據結構中,此時此線程開始執行,并可以對接收到的消息進行處理。

          中斷

          已經被設計為可以和多個中斷設備共同工作,用戶用opb_intcip核作為中斷控制器來處理硬件中斷。僅支持一個中斷控制器來連接ppc405的外部中斷引腳,而且不支持中斷控制器連接臨界的中斷。對于中斷繼承了standalone的中斷處理

          在xilkernel_main()中已經完成了初始化powerpc405的中斷表,并能使了中斷控制器連接在處理器上的非臨界的中斷。下面是摘抄xilkernel_main()內部執行相關代碼:

          xexc_init();/*初始化powerpc405的中斷表*/
        xexc_menableexceptions(xexc_non_critical);/*能使非臨界中斷*/

          下面是開發程序要做的一些工作。首先,使中斷控制器開始接收中斷;其次,把必需的非臨界中斷添加到中斷控制器上;再就是注冊此非臨界中斷;最后能使此中斷。下面是一個串口中斷接收的簡單代碼:

        void*first_thread(){......
        xintc_mmasterenable(xpar_myintc_baseaddr);
        xintc_menableintr(xpar_myintc_baseaddr,xpar_myuart_interrupt_mask);
        xintc_registerhandler(xpar_myintc_baseaddr,xpar_myuart_interrupt_intr,
        (xinterrupthandler)uart_int_handler,(void*)xpar_myintc_baseaddr);
        xuartlite_menableintr(xpar_myuart_baseaddr);
        ......
        }
        voiduart_int_handler(void*baseaddr_p){/*
        中斷處理程序*/while(!xuartlite_misreceiveempty(xpar_myuart_baseaddr)){
        ch=xuartlite_recvbyte(xpar_myuart_baseaddr);
        ......
        }
        }

          一個中斷事件和中斷處理程序相連接。而中斷處理程序應該盡量短,如果中斷處理程序不能完全處理此事件,可以由信號量同步發起一個任務來處理本事件。

          結語

          xilinx公司的vritex-iipro實現了“微處理器+可編程邏輯”的可配置設計平臺,其出眾的性能受到高端的青睞。在此平臺上利用xilkernel操作系統,為開發提供了極大的系統結構靈性。本文僅介紹了幾種常用的xilkernel的應用,讀者還可以利用互斥、軟件定時器等實現其它的功能。讀者也可以根據嵌入式開發的經驗和xilkernel的強大功能,構建復雜的fpga嵌入式系統。

        linux操作系統文章專題:linux操作系統詳解(linux不再難懂)

        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 大石桥市| 内江市| 南岸区| 武邑县| 特克斯县| 高密市| 阿拉善盟| 黄浦区| 孟州市| 略阳县| 赞皇县| 友谊县| 全椒县| 蚌埠市| 洞口县| 德庆县| 绵竹市| 横山县| 开远市| 崇州市| 北流市| 荆门市| 鸡西市| 桃园县| 江川县| 博罗县| 新乡市| 高平市| 荣昌县| 乌兰察布市| 宜城市| 宝坻区| 武城县| 宁夏| 沂源县| 迭部县| 交城县| 威海市| 剑川县| 清涧县| 丰台区|