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 裡..
留言
張貼留言