1. 程式人生 > >嵌入式系統啟動及初始化——連結檔案Project.prm

嵌入式系統啟動及初始化——連結檔案Project.prm

本文出自一本北京航空航天大學出版的書籍,摘抄至此,標為轉載,僅用來學習交流。

連結檔案Project.prm 

prm檔案主要實現了晶片的RAM和ROM的定義,初始化RAM中的變數、堆疊的大小;定義復位向量,即應用程式的預設入口;還包括了啟動程式碼,即硬體復位後的函式入口。

prm檔案有5個組成部分構成:

(1)NAMES~END部分

用於指定在連結時加入除本專案檔案列表之外的額外目的碼檔案,這種用法不常用,因為在“Libs”欄目中新增可實現同樣的功能。

(2)SEGMENTS~END部分

這部分很重要,它定義和劃分了晶片所有可用的記憶體資源,包括程式空間和資料空間。一般將程式空間定義為ROM,把資料空間劃分為第0頁的Z_RAM和非0頁的RAM,這些名字都不是系統保留關鍵字,可以由使用者隨意修改,但修改後其他部分用到必須相應更改。

記憶體劃分的具體方式如下:

由SEGMENTS開始到END為止,中間可以新增任意多行記憶體劃分的定義,每一行用分號“;”結尾。定義行的語法格式為:

[塊名] = [屬性] [起始地址] TO [結束地址];

塊名:其定義和C語言變數定義相同,是以英文字母和下劃線開頭的一個字串。

屬性:可以有三種不同的型別。對於只讀的Flash-ROM區屬性一定是READ_ONLY;對於可讀/寫的RAM區屬性可以是READ_WRITE,也可以是NO_INIT,他們兩者的關鍵區別是ANSI - C的初始化程式碼會把定位在READ_WRITE塊中的所有全域性和靜態變數自動清零,而NO_INIT塊中的變數將不會被自動清零。對於微控制器系統,變數在復位時不被自動清零這一特性有時是很關鍵的。

起始地址和結束地址:決定了一記憶體塊的物理位置,用16進製表示。

用SEGMENTS只是從MCU的實體記憶體這一角度對其進行空間劃分。源程式本身並不知道記憶體被分割和屬性定義的這些細節。它們兩者之間必須通過下面的PLACEMENT建立聯絡。

(3)PLACEMENT~END部分

指派源程式中所定義的各種段,例如資料段DATA_SEG、CONST_SEG和程式碼段CODE_SEG被具體放置在哪一個記憶體塊中。它是將源程式中的定義描述和實際實體記憶體掛鉤的橋樑。

PLACEMENT~END內所描述的資訊是告訴連結器源程式中所定義的各類段應該被具體放置在哪一個記憶體塊中去。其語法格式為:

[段名1], [段名2],… [段名n] INTO [記憶體塊名];

段名:就是在源程式中用#pragma 宣告的資料段、常數段或者程式碼段的名字。如果用預設名DEFAULT,則預設的資料段名為DEFAULT_RAM,程式碼段和常數段名為DEFAULT_ROM。若程式中定義的段名沒有在PLACEMENT中提及,則將視為DEFAULT。幾個相同性質但不同名字的段可以被放在同一個記憶體塊中,相互之間用逗號隔開。INTO是系統保留的關鍵詞,在這裡為放入的意思。記憶體塊名就是前面介紹的用SEGMENTS劃分好的不同的記憶體塊名字。利用這樣直觀的定位描述文字可以方便靈活的將資料或程式碼定位到晶片記憶體任意可能的位置,實現某些特殊目的的應用。

(4)STACKSIZE 部分

STACKSIZE 部分定義系統堆疊長度,其後給出的長度位元組數可以根據實際需要進行修改。堆疊的實際定位取決於RAM記憶體的劃分和使用情況。在常見的RAM線性劃分變數連續分配的情況下,堆疊將緊挨在使用者所定義的所有變數區域的高階。但如果將RAM區分成幾個不同的塊,必須確保其中至少有一個塊能容納已經定義的堆疊長度。

(5)VECTOR部分

VECTOR部分定義所有失量入口地址。模板在生成prm檔案時已經定義了復位向量的入口地址。對於各類中斷失量使用者必須自己按照向量編號和中斷服務函式名相關聯。如果中斷函式的定義是用”interrupt”加上向量號,則無需在這裡重複定義。

編寫中斷函式幾乎是每一個微控制器專案開發必需的一個內容。CodeWarrior針對12系列MCU的中斷函式編寫有3種方式可以實現,分別是:①關鍵詞interrupt和中斷向量編號;②用關鍵詞interrupt定義中斷函式,中斷向量入口由prm檔案指定;③用#pragma TRAP_PROC定義中斷函式,中斷向量入口由prm檔案指定。


相關推薦

嵌入式系統啟動初始——連結檔案Project.prm

本文出自一本北京航空航天大學出版的書籍,摘抄至此,標為轉載,僅用來學習交流。連結檔案Project.prm prm檔案主要實現了晶片的RAM和ROM的定義,初始化RAM中的變數、堆疊的大小;定義復位向量,即應用程式的預設入口;還包括了啟動程式碼,即硬體復位後的函式入口。prm

(1)RIL簡析(高通)——RIL如何啟動初始

Android設定了RIL層,是上層framework與Modem溝通的橋樑。高通使用qcril作為其vendor-RIL,與modem之間使用QMI機制通訊。 分3篇分析下面的問題: RIL如何啟動及初始化? RILJ和RILD如何關聯? RILJ

PackageManagerService啟動初始流程

PackageManagerService也是有ServerThread啟動的,執行在system_process程序。 我們先來看下PackageManagerService是怎麼啟動的: PackageManagerService的啟動需要四個引數,c

①操作系統安裝流程初始規範

①操作系統安裝流程及初始化規範v1.0-陳泰成-20180306v1.1-陳泰成-20180320 操作系統安裝流程 1 ) 調用cobbler-api安裝操作系統2 ) 調用saltstack-api進行系統初始化3 ) 調用dns-api解析主機名4 ) 調用zabbix-api對該

操作系統安裝安裝初始規範

系統安裝流程操作系統安裝安裝及初始化規範 V2.0 操作系統安裝流程 服務器采購 服務器驗收並設置raid 服務商提供驗收單,運維驗收負責人簽字 服務器上架 資產錄入 開始自動化安裝 將新服務器劃入裝機vlan 根據資產清單上的mac地址,自定義安裝。 1、機房 2、機房區域 3、機櫃 4、服務器位置

【Java.Web】Servlet —— Servlet容器的啟動Servlet建立初始,容器預設的Servlet

Servlet容器 —— 以tomcat為例 在tomcat容器等級中,context容器直接管理servlet在容器中的包裝類Wrapper,所以Context容器如何執行將直接影響servlet的工作方式。 tomcat容器模型如下: 一個context對應一個web

基於FS4412嵌入式系統移植(2) NFS檔案系統啟動linux體驗

這一節目標有3個: 1、將uboot拷貝到emmc中,並在emmc中啟動uboot 2、除錯tftp,能夠通過uboot使用tftp從linux的tftp共享資料夾中拷貝資料到開發板記憶體中。 3、設定uboot啟動配置,達到能夠從伺服器中載入核心和裝置樹,並掛載nfs檔案

Linux虛擬檔案系統(核心初始

這部分主要對linux虛擬檔案系統核心初始化部分做些補充。 關於shrinker,inode和dentry cache初始化階段都需要註冊自己的shrinker,用於縮減cache。兩個操作原理類似。 shrinker資料結構介紹 /* * A callback you

Android Input系統原始碼分析一(啟動初始

一. Input系統的啟動Android Framework是由一系列的Service所構建起來的,其中與Input相關的主要是InputManagerService(IMS)。我們看看IMS的啟動流程。IMS是在SystemServer.startOtherService中

錯誤修改初始引數檔案導致oracle啟動失敗!

如果錯誤的修改了引數檔案導致資料庫不能啟動,由於spfile是採用的二進位制檔案,不能直接修改。 可以通過spfile建立pfile,手動修改pfile,利用pfile啟動資料庫,然後再通過pfile建立spfile: SQL> startup ORACLE 例程已經

SpringBoot——專案啟動時讀取配置初始資源

# 介紹   在開發過程中,我們有時候會遇到非介面呼叫而出發程式執行任務的一些場景,比如我們使用`quartz`定時框架通過配置檔案來啟動定時任務時,或者一些初始化資源場景等觸發的任務執行場景。 # 方法一:註解 ### 方案   通過使用註解`@Configuration`和`@Bean`來初始化資源,配

多重繼承關系初始順序初始

java 所有 clas 屬性 配對 -- 如果 實現 硬盤 順序:父類屬性--> 父類構造方法--> 子類屬性--> 子類構造方法 初始化: 1.在創建類之前,檢查是否已加載檢查硬盤上的.class是否加載到內存中,如果沒有加載就先加載父類的文件,再加載

EF6 學習筆記(一):Code First 方式生成數據庫初始數據庫實際操作

view sqlserver 4.5 xpl 安裝 右鍵 ef6 字符串 ref 參考原文地址: https://docs.microsoft.com/en-us/aspnet/mvc/overview/getting-started/getting-started-wit

linux--系統啟動安裝過程詳解

linux啟動先通過一張圖來簡單了解下整個系統啟動的流程,整個過程基本可以分為POST-->BIOS-->MBR(GRUB)-->Kernel-->Init-->Runlevel本文出自 “運維自動化” 博客,請務必保留此出處http://shower.blog.51cto.co

CentOS系統啟動內核大破壞模擬實驗

啟動 內核和 管理 講過了centos的啟動流程,此時是不是想來點破壞呢?那就盡情的玩耍吧,記得在實驗之前拍個快照,萬一哪個環節錯誤恢復不回來了呢,畢竟數據無價,話不多說,開始。 一、刪除偽系統根。(ramdisk文件) (1)模擬誤操作刪除ramdisk文件。 ①模擬誤刪除initra

定義結構體變量初始

style 不想 占用空間 clas 個學生 truct 學生 釋放 ring   雖然已經了解結構體類型,但是結構體類型變量的定義只有一種方法麽,這個當然不是的,所以我把我所知道的幾種方法列出來供給大家參考一下;   首先是第一種,也是我們經常用的一種: 1 #inc

監聽器-啟動初始表 學習筆記:

監聽器-啟動會初始化表 學習筆記:遇到問題: 數據庫連接問題;後面采用固定寫法: 解決問題 /**c3p0取得數據源*/ public static DataSource getDataSource() throws Exception { ComboPooledDataS

Spring Boot 2.0(七):Spring Boot 如何解決項目啟動初始資源

springboot在我們實際工作中,總會遇到這樣需求,在項目啟動的時候需要做一些初始化的操作,比如初始化線程池,提前加載好加密證書等。今天就給大家介紹一個 Spring Boot 神器,專門幫助大家解決項目啟動初始化資源操作。 這個神器就是 CommandLineRunner,CommandLineRunn

***靜態成員的定義初始 for c++ for新用法

用法 靜態數組 In const AI code 引用 clu RR 靜態成員的初始化要在類外不然報錯error: ISO C++ forbids in-class initialization of non-const static member ‘***‘ 但是聲明為

vue 環境的搭建初始項目

項目目錄 comm 初始 cmd .com config path init cache 其實超級簡單,雖然網上很多,但是我順便記錄下相當於做筆記吧 1nodejs 的安裝, 在node官網下載,點擊安裝,安裝的時候最好選擇路徑在d盤 2設置環境變量 我的電腦-->屬