網頁

2013年12月30日 星期一

[CCS] Files in a CCS project

 

在CCS (Code Composer Studio) 中, 通常會有以下的目錄及檔案. 這裡簡單的說明目錄和檔案, 並且標示在使用版本控制的時候, 那些檔案需要 check in, 那些不需要.

.settings 目錄

這是一個標準的 Eclipse 目錄, 用來存放 project 的相關設定.

必需 check in.

.ccsproject 檔案

CCS 自訂的專案檔案. 以 HTML 的格式, 記錄 CCS 對這個專案的設定. 以下舉一個例子說明, 某專案的 .ccsproject 檔案內容可能如下, 綠色的部份是另外加上的說明註解

<?xml version="1.0" encoding="UTF-8" ?>HTML 表頭, 說明這是一個 HTML 文件
<?ccsproject version="1.0"?>CCS 自我參考用的版本號碼
<projectOptions>CCS 自我參考用的版本號碼
    <deviceVariant value="Cortex M.LM4F120H5QR"/>設備代碼
    <deviceFamily value="TMS470"/>設備家族
    <deviceEndianness value="little"/>設備屬於 little endian, 低位元組在前面
    <codegenToolVersion value="5.0.4"/>Tool Chain 版本
    <isElfFormat value="true"/>輸出的 binary 是 elf 格式
    <linkerCommandFile value="lm4f120h5qr.cmd"/>連結器的命令檔, 在最後面還會有說明
    <rts value="libc.a"/>指定 C 的 run time library
    <templateProperties value="id=com.ti.common.project.core.emptyProjectWithMainTemplate,"/>
</projectOptions>

必需 check in.

.cproject

Eclipse 的專案檔案.

必需 check in.

.project

Eclipse 的專案檔案.

必需 check in.

.launches

debug session 時所建立的目錄.

不需 check in.

Debug 目錄

編譯 debug 組態時所建立的目錄.

不需 check in.

Release 目錄

編譯 release 組態時所建立的目錄.

不需 check in.

lm4f120h5qr.cmd

Linker Command file, 不同的處理器, 會有不同的記憶體映射配置. 以下用一個例子說明, 檔案中的註解已經先去除. 綠色的部份是另外加上的說明註解.

--retain=g_pfnVectors 這部份沒有查到正式的資料, 不過可以推測的是, 這是要要求 linker 在做最佳化的時候, 保留這塊變數. 儘管沒有被參考到.

MEMORY 記憶體定義區塊
{
    FLASH (RX) : origin = 0x00000000, length = 0x00040000 Flash 的定址空間從 0 開始, 長度為 256 K, 可以讀取執行, 不能寫入
    SRAM (RWX) : origin = 0x20000000, length = 0x00008000 SRAM 的定址空間從 0x20000000 開始, 長度為 32K, 可以讀取執行寫入
}

SECTIONS 記憶體子區塊內容定義
{

中斷向量表放在開頭的地方, 其他子區塊循序堆放
    .intvecs:   > 0x00000000
    .text   :   > FLASH
    .const  :   > FLASH
    .cinit  :   > FLASH
    .pinit  :   > FLASH
    .init_array : > FLASH

中斷向量表放在開頭的地方, 其他子區塊循序堆放

    .vtable :   > 0x20000000
    .data   :   > SRAM
    .bss    :   > SRAM
    .sysmem :   > SRAM
    .stack  :   > SRAM
}

堆疊位址在 SRAM 的最後面, 長度為 512 bytes

__STACK_TOP = __stack + 512;

必需 check in.

startup_ccs.c

實務上, 我們一定也會定義一個中斷向量表, 如同 Linker Command file 內所引用到的, --retain=g_pfnVectors, 這個 g_pfnVectors 就是中斷向量表. 它的內容是各種中斷發生的時候, 所對應到的中斷處理函式.

這個檔案中, 通常也會包含一些預設的 中斷處理函式.

必需 check in.

2013年12月27日 星期五

[CCS] Create new workspace

 

在 CCS (Code Composer Studio v5) 中, 會把許多的專案放在一個 workspace 中. 如果只用一個 workspace, 當然也是可以的. 只不過在開發階段, 如果用到不同的 configuration, 以及不同人的程式需要整合, 就會變得有點亂.

舉例來說, 開發的初期階段, 可能會用到 evaluation board, processor 和 layout 可能和最終版本不同, 同時, 也有另外一個人在發展程式, 然後在最後要 release 的時候, 可能又會遇到 third party 的library 更新. 最麻煩的事, 隨時都有一個人不小心經過, 要來要一個最新的版本. 嗯, 通常不是修改中, 沒辦法給, 就是改完還沒測, 它不 work.

我偏好的方式是開幾個 workspace, 一個放穩定的版本, 一個當作工作目錄, 需要和 version control 整合的時候, 還可以開暫時的 workspace.

CCS 開 workspace 的方式有點特別, 這邊特別說明一下.

1. Create Folder

在硬碟中的任意空間, 建立任意的目錄. 我開一個 C:\NNTP 當做範例

2. Switch workspace

打開 CCS. 在 File/Switch Workspace的選項中, 選擇 Others01-create-workspace

按下 Browse, 切換到 C:\NNTP

02-select-folder

經過短暫的處理, CCS 會把它設定成 CCS 的 workspace

3. CCS workspace files

CCS 會在這個目錄下, 增加兩個目錄

.metadata

dvt

這兩個目錄是和 workspace 相關的, 在用 version control 的時候, 例如說 git, 切記千萬不要同步它. 要把它設定成排除的項目.

4. Remove workspace

要移除 workspace 的時候, 要先切換到其他 workspace, 使得該 workspace 成為非使用中的 workspace. 然後從檔案系統中刪除它.

不過, 這個 workspace 還是會在 workspace 的列表中出現. 要從列表中刪除, 要從 CCS 的選單中, 選擇 Window\Preferences\General\Startup and Shutdown\Workspaces03-remove-workspace 

選擇要刪除的 workspace, 然後按 Remove, 就可以從列表中刪除它.

2013年12月22日 星期日

[RTOS] Introduction to FreeRTOS

 

FreeRTOS 是一個 open source 的 RTOS, 應用在 embedded system . FreeRTOS 的授權方式採用 GPL, 但是有選擇性的例外. 這部份指的是, 採用 FreeRTOS 的系統, 除了 kernel,  也就是 FreeRTOS 的部份, 必須遵守 GPL 以外, 使用者自己專有的原始碼, 不需因此感染而成為 open source.

FreeRTOS 的特性

Thread, mutex, semaphore, soft-timer.

Tick-less mode

大部份現在 embedded system 的處理器, 為了追求省電, 都會有深層的睡眠模式. 在深層的模式下, 有時連 timer 都會關掉. Tick-less mode 就是為了適應這種狀況下還能正常工作.

Memory allocation schema

FreeRTOS 有 4 種 memory allocation 的 schema

1. allocate only

2. allocate and free, simple algorithm

3. allocate and free, complex algorithm’'

4. C library allocate and free with mutural execution protection

Memory allocation schema

Thread library vs. Operation system

相較來說, FreeRTOS 更像是 thread library, 而不像 operation system. Host program 維護一組 thread, 並且在一定時間內, 輪詢這些 thread, 並呼叫這些 thread 的 tick function.

換句話說, context switch 並不是由 interrupt 觸發, 再進到 OS 層來做 context switch, 而是由使用者的程式 ( host program) 來分配 thread 的作業時間. 這樣的架構, 有兩個問題必須特別注意.

1. 長時間佔用的問題, 因為 OS 沒有強制奪取執行序列的能力, 會不會有一個 thread 佔用太長的作業時間, 沒有交還 CPU 的控制權. 這樣的狀況會不會發生, 如果發生, 應該如何因應 ?

2. 系統反應時間的問題, 必須立刻反應的動作, 也要等到 host program 輪詢到才能開始運作. 系統反應時間較長, 且不能預期完成反應的時間.

[RTOS] Introduction to MQX RTOS

 

What’s MQX RTOS

MQX RTOS 是一套 RTOS, 最早是由 Precise Software Technologies Inc. 所開發, 現在主要由 FreeScale 所銷售.

MQX 是 Message Queue eXecutive 的縮寫.

MQX 的特點

Multitasking Kernel

Pre-emptive scheduling

系統可以在一個 task 執行中, 介入切換至另一個 task.

Fast interrupt response

Extensive inter-process communication

Synchronization facilities

File system

Small, configuration size

最小可調整至 6K ROM, 含 kernel, interrupt, semaphore, queue, memory manager

MQX 的附加模組

TCP/IP stack

embedded MS-DOS

USB Host/Device stack

 

MQX 的工具

BDM/JTAG

Background Debugging Mode, FreeScale 的 device 常見的 in-circuit debugging 介面.

Processor Expert Software

Processor Expert Software is a development system to create, configure, optimize, migrate, and deliver software components that generate source code for Freescale silicon

MQX Task-Aware Debugging

 

MQX 支援平台

Kinetis

FreeScale 的 Arm 系列 CPU.

CodeFile

PowerPC

ARC

Arm

StrongARM

xScale

2013年12月18日 星期三

[CCS] Using static library

通常, 我們會把一個專案, 分成幾個小部份, 或稱為模組. 在 firmware 的環境中, 會把它具體表現在 library. 之所以是 static, 是因為它不是 dynamic, 它是和主程式部份連結在一起, 並不是需要的時候才動態載入. Firmware 通常不用動態載入, 因為它需要比較複雜的記憶體管理.

1. 建立 static library

從 File 選項, 選擇 New, 在專案選項中, 選擇 CCS Project. 在 output type, 選擇 Static Library. 在下面的 Project templates 中, 選擇 Empty Project, 稍後再自己加入檔案.

 01-create-library

2. 加入 library 檔案

在左邊的 Project Explorer 窗格中, 找到專案名稱( TrialLib), 然後按右鍵 New/File 加入檔案. 在 File Name 的編輯框中, 輸入 TrialLib.c. 用同樣的方法加入 TrialLib.h

02-add-c-file

3. library 的 .c file 內容

打開 TrialLib.c 的內容, 加入以下內容

#include <stdint.h>
#include <stdbool.h>

unsigned int increment(unsigned int a)
{
    return (++a);
}

unsigned int addition(unsigned a, unsigned int b)
{
    return (a+b);
}

03-edit-c-file

4. library 的 .h 的內容

在 TrialLib.h, 加入以下內容

#ifndef TRIAL_LIB_H
#define TRIAL_LIB_H

unsigned int increment(unsigned int a);

unsigned int addition(unsigned int a, unsigned int b);

#endif

04-edit-h-file

 

5. 編譯 library

在專案名稱上面按右鍵, 選擇 build project. 編譯後的訊息如下圖. 注意在 Project Explorer 中, 增加了 Debug 目錄, 可以在其中找到 TrialLib.lib, 這就是我們所要連結的 library 檔案. 另外, 我們編譯的版本是 debug, 如果選擇 release, 在追蹤程式執行的時候, 將會有無原始碼的警告.

05-make-library

6. 建立主執行專案

從 File 選項, 選擇 New, 在專案選項中, 選擇 CCS Project. 在 output type, 選擇 Executive. 在下面的 Project templates 中, 選擇 Empty Project (with main.c).

06-create-executive

7. 編輯 main.c

在 main.c 中, 加入以下程式碼, 這個專案目前是無法編譯, 還需要加入 triallib.h 的參考, 以及 triallib.lib 做連結

#include <stdint.h>
#include <stdbool.h>

#include "TrialLib.h"

int main(void) {
    volatile unsigned int result, a, b;

    a = 10;
    b = 55;

    result = increment(a);

    result = addition(a,b);

    while (1) ;

}

07-edit-main

 

8. 設定 include path

在專案名稱上按右鍵, 選擇 Properties, 打開專案屬性. 依序打開 Build/Option.

08-include-option

在 Add dir to #include search path ….的右方, 按下 + , 跳出 Add directory path 對話框

09-include-option-folder

按下 Workspace 按紐

10-include-option-folder-selection

選擇 TrialLib 目錄. 按下 OK. 回到對話框. 再按一次 OK, 回到 Include Options 畫面, 再按一次 OK.

9. 加入 library 檔案

在專案名稱上按右鍵, 選擇 Add Files, 出現 Add files to Trial4 的對話框,

11-link-add-files

瀏覽至 TrialLib 的 debug 目錄, 選擇 Triallib.lib, 並按下開啟檔案. 開啟 File Operation 對話框.

12-link-file-location 

選擇 Link to files, 並確定 Create link locations relative to : WORKSPACE_LOC, 然後按下 OK.

這樣會讓 CCS 在連結階段, 自動到 TrialLib 的目錄去尋找 Triallib.lib 這個檔案.

 

10. 重新編譯.

這樣應該就可以編譯成功, 並且執行.

11. 注意事項

1. library 和 executive 的 C/C++ 的選項要一致. 否則在 link 的階段會發生錯誤.

2. 如果不小心修改到 TrialLib 的專案, 並且產生 triallib.lib, 那麼編譯 Trial4 的專案就會含入這個修改.

2013年12月17日 星期二

[CCS] Using C++ in Code Composer Studio

 

1. 建立新專案

從 File 選項, 選擇 New, 在專案選項中, 選擇 CCS Project. 在 Variant 的列表中, 找出所支援的型號. 這個要特別注意. 一旦選定, 就很難再修改. 在 project template 中, 選擇 Empty Project (with main.c). 然後, 輸入專案名稱 (例如 Trial3) 後, 按下 Finish.

01-new-project

2. 設定參考路徑

在左邊的專案列表欄中, 找到新建立的專案 (例如 Trial3). 在專案的名稱上按右鍵, 打開專案屬性表格. 在左邊的設定項目中, 依序打開設定項目: build/ ARM Compiler/Include Options.

02-include-path-01

在右下方的 include path 窗格的右上方, 找到 “+” 號, 並且點擊. 在目錄中, 填入

"${TIVAWARE_INSTALL}"

這是 Tiva Ware 安裝路徑的環境變數.

03-include-path-02

輸入完, 按 OK. 回到 Include path 畫面, 應該和下圖相同.

04-include-path-03

3. 加入 library

在專案名稱上按右鍵, 並且選擇 Add Files. 打開加入檔案的對話框. 瀏覽至 Tiva 的安裝目錄, 並且選擇 driverlib/ccs/Debug. 我的安裝目錄是 C:\ti\TivaWare_C_Series-1.0\driverlib\ccs\Debug, 選擇driverlib.lib 並且打開.

05-driverlib-01 

在加入檔案的選項中, 選擇 Link to files, 並且以 TIVAWARE_INSTALL 作為參考. 這樣的做法就不會把 driverlib.lib 複製到專案中, 只有在要用到的時候, 才根據 Tiva Ware 的安裝目錄來加入這個檔案. 除了避免複製一大堆相同的檔案外, 也可以避免版本有差異的情形.

06-driverlib-02

4. 設定語言選項

在專案名稱上按右鍵, 打開專案屬性表格. 依序打開設定項目: Build/ARM Compiler/Advanced Options/Language OPtions

07-language-option-01

把 Treat C files as C++ files 這一個項目打勾. 是的, 就是把 C 的檔案也當做 C++ 的檔案來編譯.

08-language-option-02

5. 測試 C++ 程式碼

將以下程式碼, 取代原本 main.c 的內容. 以下的內容, 是根據 TM4C123G_LaunchPad_Workshop lab4 的內容, 只是加入 C++ 的語法, 把程式碼搬移而已. 如果有問題, 可以先參考前面所說的範例.

#include <stdint.h>
#include <stdbool.h>
#include "inc/tm4c123gh6pm.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/sysctl.h"
#include "driverlib/interrupt.h"
#include "driverlib/gpio.h"
#include "driverlib/timer.h"

class HelloWorld
{
public:
    HelloWorld() {};
    ~HelloWorld() {}

public:
    static void Blink();
};

void HelloWorld::Blink()
{
    TimerEnable(TIMER0_BASE, TIMER_A);

    while(1)
    {
    }
}

int main(void) {
    uint32_t ui32Period;

    SysCtlClockSet(SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN);

    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
    GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3);

    SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);
    TimerConfigure(TIMER0_BASE, TIMER_CFG_PERIODIC);

    ui32Period = (SysCtlClockGet() / 10) / 2;
    TimerLoadSet(TIMER0_BASE, TIMER_A, ui32Period -1);

    IntEnable(INT_TIMER0A);
    TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT);
    IntMasterEnable();

    HelloWorld::Blink();

    return 0;
}

 

6. 注意事項

CCS 的編輯器可以做動態的語法檢查. 不過, 有時候似乎不是判斷得很準確. 但是並不影響真正的編譯和執行. 據了解, 這個問題已經列入 bug, 也許下一個版本會有修正.

09-notice-01