新聞中心

        EEPW首頁 > 物聯網與傳感器 > 設計應用 > 多核處理器下智能車載平臺的設計與實現

        多核處理器下智能車載平臺的設計與實現

        ——
        作者:盧朝洪 金曦 唐岳東 楊國青 時間:2013-06-26 來源:電子產品世界 收藏

          初始化頁表

        本文引用地址:http://www.104case.com/article/146841.htm

          在OMAP4430硬件平臺上,同構的兩個處理器內核共享同一個硬件MMU資源,因此在基于Linux的驅動源碼初始化MMU硬件后,整個系統都運行在虛擬地址模式下,接下來MMU模塊調用__create_page_table創建了整個系統的臨時頁表。然后程序跳轉至Linux內核入口函數start_kernel()處,在該函數中啟用SMP,在SMP模塊的__cpu_up函數中插入創建SmartOSEK OS頁表的操作osek_setup_pgd()。最后,在start_kernel中調用自定義的函數osek_mm_init(),對臨時頁表中SmartOSEK OS對應的區塊進行重映射,分配一個新的物理地址空間,改寫頁表將新分配的物理地址對應于該段虛擬地址,使得SmartOSEK OS物理內存對Android內核不可見,從而完成了二者內存資源的相互隔離。

          創建中斷向量

          在系統初始化后,大部分的硬件外設資源都將分配到對應的操作系統中的中斷向量表中。對于Android OS在cpu0完成系統初始化后,系統就只生成Android OS私有資源對應的中斷向量表。而在SmartOSEK OS中,中斷向量表是針對于物理地址模式的,需要在MMU設備映射函數中增加申請一頁空間作為SmartOSEK OS中斷向量表,并將其入口的邏輯地址臨時定為0xffff8000。通過osek_setup_pgd()函數拷貝臨時頁表后,需要將中斷向量表所屬的頁表進行重新映射為0xffff0000,以滿足硬件平臺的要求。最后在異常向量初始化函數kuser_get_tls_init的最后調用自定義函數osek_setup_vectors(),將SmartOSEK OS物理地址模式下的中斷向量表osek_vectors拷貝到新建的實時內核中斷向量表中。

          設置系統入口

          在完成資源分區后,主核cpu0觸發核間中斷啟動第二個核cpu1。為了將實時內核SmartOSEK OS綁定到cpu1上,需要將cpu1的運行入口,即cpu1響應主核核間中斷的處理函數更改為SmartOSEK OS的入口函數。因此需要改寫相應的函數secondary_start_kernel(),調用osek_entry()啟動SmartOSEK OS。并在osek_entry()中初始化cpu1私有定時器資源。

          內核間通信

          在共享內存空間上劃分出三段連續的空間分別用于同步數據緩沖區和兩個方向上異步通信的消息隊列。如圖3所示。src字段為消息的發送方執行實體的ID,dest字段為消息接受方處理實體的ID。size字段為消息的有效長度。msg字段為消息的內容。共享內存是通過靜態分配實現的,同步消息緩沖區和異步消息隊列一條消息的最大長度和隊列大小等信息需要靜態配置?! ?/p>

        ?

          通過核間中斷的方式實現通信的雙方信號的發送。在主核cpu0上注冊四個新的核間中斷。前兩二個中斷用于發送方觸發信號通知接收方數據發送完成;后兩個中斷用于同步數據時,Android向SmartOSEK發出的同步發送信號,以及SmartOSEK接收完成數據后發出的反饋信號。當發生核間中斷時,中斷處理函數osek_handle_IPI()判斷當前觸發的核間中斷類型并調用相應的響應函數。

          平臺驗證

          對于分區功能,主要測試Android OS和SmartOSEK OS能夠正確啟動,二者能夠分別運行在兩個處理器上并訪問各自的私有資源,正確響應對應資源相關的中斷而互不干擾。圖4為系統運行時通過串口打印的部分log信息,此時SmartOSEK周期性地調用任務4到任務0,Android執行其他初始化的工作?! ?/p>

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


        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 文成县| 宜阳县| 泽普县| 蒙阴县| 上杭县| 高清| 崇义县| 息烽县| 博湖县| 尚志市| 庆元县| 博白县| 潮安县| 恭城| 勃利县| 山西省| 容城县| 托克托县| 通河县| 新巴尔虎左旗| 伊宁县| 炎陵县| 邵武市| 新河县| 渭源县| 阳江市| 富阳市| 宁强县| 隆昌县| 大余县| 深水埗区| 阳江市| 五寨县| 临湘市| 湟源县| 建平县| 虞城县| 岑巩县| 依兰县| 定南县| 九江市|