ARM tool - uvision - embedded software development


Ref: embedded software development

Ref: ARM v2m MPS2

1.   project options :

      - Device : 選擇 CPU

      - Output : name of executable - 名稱會決定其他相關檔案

      - Target : 設定 clock / memory area / 使用 microlib

      - C/C++ : 可設定 Optimization 等級
   
      -  Linker : memory layout from target diagram / scatter file

     -  Debug : Fast Model Debugger

====

* 前三個 baseline / 第四個 MPU 改用 mainline

   模擬器都能使用

* 之前在 mac 用 virtualbox 裝 win7 64 bit , 程式很容易當機.
 
   改用 parallels desktop 就好多了


* 相關程式 : git workbook


====

Session 1: Reset and Initialization 

1. __main / __rt_entry






2. SystemCoreClock


    屬於 CMSIS-Core , 全域變數代表目前系統 clock


3. SysTick_Handler

    在 startup_<device>.s , 屬性宣告為 weak

       EXPORT SysTick_Handler    [WEAK]

    因此可以在 exceptions.c 另外寫一個取代它


4. debug 開始後, 可以開始設 watch



設定 watch 之後, free run 可以看到數值不停跳動


5. Fixed Virtual Platform Model


====

Session 2 : Scatter loading



1. scatter file :
    *.o (RESET, +First)

     表示把 RESET AREA 放在最前面

vector table 位於 startup_<device>.s

AREA RESET, DATA, READONLY
EXPORT __Vectors
EXPORT __Vectors_End
EXPORT __Vectors_Size
__Vectors DCD __initail_sp
                    DCD Rest_Handler
...


2. load view / execution view


3. placement of _at sections at a specific address

指定變數位置在 0x10001000


程式 :

const int access_key __attribute__((section(".ARM.__at_0x10001000"))) = 0xACCE55ED;


debug 時, 用 memory 可看到該位置寫入正確值



scatter file : 加入一個 section 0x10001000


memory 配置



===

Session 3 

1. MicroLib

在 options 的 target 可以設定是否使用 MicroLib, 沒有勾選的話是使用 standard

我們可以各 build 一次, 然後看 listing 中的 map file 來比較.


standard: 1480+4456+1484 = 7420



microlib : 572+1288+576 = 2436, 只需要原本的 23%, 省下 7 成 size.


2. Options -> User : 可以自設一些命令

    e.g. fromelf -c -o .\Listings\exam3.txt .\Objects\exam3.axf

可以產生 elf 檔案的列表和組語


3. Linker 參數 : --load_addr_map_info


左邊是有下, 右邊沒下. 兩個相比, 多了一個 load addr 的欄位



4. retargeting - 轉 uart

   * 除了所列的之外, Board Support - Common 也要選, 不然 stdout_USART.c 找不到 device.h

   *  很奇怪的, 會出現 __ARM_use_no_argv 有問題, 可以把這幾行 mark 掉

  * debugger emulator 會自動開啟 telnet localhost


PS: 假如出現以下畫面, 表示



要在 Program and Features 開啟 Telnet client service


===

Session 4 : Memory Protection

1. MPU 設定方法 :
 
    (1) memory management fault enable

    (2) MPU regions 有 16 個

    (3) MPU disable/enable, MPU control register / barrier


DMB,DSB,ISB

更改 MPU 時, 需要留意 barrier

DMB : program order 前 所有 memory access 動作都完成

DSB : 比 DMB 嚴格, 還做了
  • 位于此指令前的所有显式内存访问均完成。
  • 位于此指令前的所有高速缓存、跳转预测和 TLB 维护操作全部完成。

ISB : 針對 指令, 影響最大, 因為會把 pipeline 整個清除

2. hard fault handler

    CFSR 

測試 1.  memory 1 是 RO, 測試寫入





Ref: ARM Compiler 6

==============================================================


Security

Ref: Security extensions




1. Keil_v5\UV4\UVCC.ini : 可以先暫時解決 warning

2. output 訊息, 可參考前面 session 3 : retarget 做法, 記得 service 開 telnet client

3. multiproject : project 順序會影響 build 順序, 可以從 Manage Multi-project Workspace  移動順序

4. debug 時要把 active project file 設在 non-secure

5. 切到 assembly 視窗可以單步 trace assembly

這次仍然 hard fault 了. BLXNS 有跳過去. 可能後面對照產生的 map 來看是否有設錯

並且修正 hard fault handler



實際追下去也挺有趣的.

__main


 hardfault 在 scatter load 裡..


留言

熱門文章