CMP R1, #1
LDREQ SP, =StackUsr
BL $IRQ_Exception_Function ; 調用c語言的中斷處理程序
MSR CPSR_c, #(NoInt | SYS32Mode) ; 切換到系統模式
LDR R2, =OsEnterSum ; OsEnterSum,使OSIntExit退出時中斷關閉
MOV R1, #1
STR R1, [R2]
BL OSIntExit
LDR R2, =OsEnterSum ; 因為中斷服務程序要退出,所以OsEnterSum=0
MOV R1, #0
STR R1, [R2]
MSR CPSR_c, #(NoInt | IRQ32Mode) ; 切換回irq模式
LDMFD SP, {R3, SP, LR}^ ; 恢復用戶狀態的R3,SP,LR,注意不能回寫
; 如果回寫的是用戶的SP,所以后面要調整SP
LDR R0, =OSTCBHighRdy
LDR R0, [R0]
LDR R1, =OSTCBCur
LDR R1, [R1]
CMP R0, R1
ADD SP, SP, #4*3 ;
MSR SPSR_cxsf, R3
LDMEQFD SP!, {R0-R3, R12, PC}^ ; 不進行任務切換
LDR PC, =OSIntCtxSw ; 進行任務切換
MEND
END
2.注意事項:
(1)OS_STK_GROWTH中指定堆棧的生長方式:為1表示堆棧從下往上生長,0表示堆棧從上往下生長。
(2)在OSTaskStkInt初始化堆棧的函數必須保存CPU相關資源,如寄存器。
3.其他的都在移植源代碼中有相關注釋及說明。
三.完成項目
1.源代碼編譯通過,完成了所有的移植工作,項目也達到預期的效果,操作系統正常的跑起來了。
2.通過應用程序的測試,下面是運行成功后的第一個應用的主程序:
/****************************************Copyright(c)**************************************
** FreshAir嵌入式軟件開發團隊
** FreshAir
** http://www.FreshAir.com
**--------------File Info------------------------------------------------------------------
** File name: main.c
** Last modified Date: 2009-07-22
** Created by: 吳友強
**Created date:2009年7月21日0:00
** Version: V1.0
** Descriptions:成功移植uCOSII操作系統后的第一個應用程序:GPIO輸出實驗
******************************************************************************************/
#include 'config.h'
#include 'stdlib.h'
#define LED1 (1 << 18)
#define LED2 (1 << 19)
#define TaskStkLengh 64 //定義用戶任務0的堆棧長度
#define TaskLED1StkSize 128 //定義用戶任務1的堆棧長度
#define TaskLED2StkSize 128 //定義用戶任務2的堆棧長度
OS_STK TaskStk [TaskStkLengh]; //定義用戶任務0的堆棧
OS_STK TaskLED1Stk[TaskLED1StkSize];//定義用戶任務1的堆棧
OS_STK TaskLED2Stk[TaskLED2StkSize];//定義用戶任務2的堆棧
void Task0(void *pdata); //Task0 任務0
void TaskLED1(void *data);
void TaskLED2(void *data);
int main (void)
{
OSInit ();
OSTaskCreate (Task0,(void *)0, &TaskStk[TaskStkLengh - 1], 2);
OSStart ();
return 0;
}
/****************************************************************************************** Task0 任務0
******************************************************************************************/
void Task0 (void *pdata)
{
pdata = pdata;
TargetInit ();
OSTaskCreate(TaskLED1, (void *)0, &TaskLED1Stk[TaskLED1StkSize - 1], 3);
OSTaskCreate(TaskLED2, (void *)0, &TaskLED2Stk[TaskLED2StkSize - 1], 4);
while (1)
{
OSTimeDly(10);
}
}
void TaskLED1(void *pdata)
{
pdata = pdata;
PINSEL2 = PINSEL2 & (~0x08);
IO1DIR |= LED1;
IO1SET = LED1;
for (; ;)
{
IO1CLR = LED1;
OSTimeDly(OS_TICKS_PER_SEC / 4);
IO1SET = LED1;
OSTimeDly(OS_TICKS_PER_SEC / 2);
}
}
void TaskLED2(void *pdata)
{
pdata = pdata;
PINSEL2 = PINSEL2 & (~0x08);
IO1DIR |= LED2;
IO1SET = LED2;
for (; ;)
{
IO1CLR = LED2;
OSTimeDly(OS_TICKS_PER_SEC / 2);
IO1SET = LED2;
OSTimeDly(OS_TICKS_PER_SEC / 1);
}
}
四.項目經驗總結及心得
1.通過長期的學習相關知識和不斷的嘗試編碼及測試,終于成功的所有的源代碼通過編譯,在看到沒有錯誤提示的那一刻是多么的興奮無法形容。
2.雖然這個項目成功并且是出色的完成了,但這只是開始,是以后做項目的開端,可以把這個項目運用到以后項目中去
3.通過自學和不斷的摸索讓自己的自學能力有很大幅度提高,項目的成功完成也讓我對自己未來的學習更有信心,為自己下一步學習linux操作系統和ARM9及ARM10或ARM11打下了良好的基礎。
4.通過<<嵌入式實時操作系統μC/OS-Ⅱ(第二版)>>閱讀讓我基本掌握了μC/OS-Ⅱ這個操作系統,主要學習里面的設計思想,這個操作系統屬于RTOS,對于這一類設計思想有了一個很好的了解,更重要的一點在閱讀這個系統的源代碼時吸收了許多很好的編程風格和編程思路,當然還有更多的編程技巧。
5.移植過程中遇到主要問題解決:
(1)編譯器產生#error這個地方錯誤,通過查看編譯器的文檔,通過加入-Ep編譯選項成功解決。
(2)頭文件包含錯誤,主要是文件組織結構沒有弄好,最后還是下定決心從新開始,通過解決一個兩個等的編譯錯誤最終成功并且運行
(3)移植的過程中對于很多宏定義出現錯誤,要不是沒有定義,要不是重復定義,最終通過耐心修改源代碼得以解決
6.通過解決項目過程中遇到的很多問題,提高了自己解決問題的能力,也讓自己相信,只要努力做一件事并且堅持不懈,最終是能夠成功的
上一篇:Windows CE6.0中斷實驗過程
下一篇:arm linux 移植 mtd-utils 1.x
- 熱門資源推薦
- 熱門放大器推薦
設計資源 培訓 開發板 精華推薦
- 使用 ROHM Semiconductor 的 BD9A600MUV 的參考設計
- NB6N11SMNGEVB,時鐘/數據接收器評估板
- 使用 Analog Devices 的 LT124XCS8 的參考設計
- DSO138mini示波器電源模塊
- CN0277
- 5V集中供電系統捏!
- A000044,Arduino GSM Shield(集成天線)允許 Arduino 板連接到互聯網、撥打/接聽語音電話和發送/接收短信
- NCP45521IMNGEVB,具有超低 Ron 的集成負載開關,11.5A 評估板
- 用于可調電流源的 LT1764AEFE-1.8 LDO 穩壓器的典型應用
- 使用 Analog Devices 的 LTC1596-1BISW 的參考設計
- 南芯科技推出高集成度多口移動電源解決方案,助力充電寶市場穩健發展
- 英飛凌推出具有超低導通電阻的CoolSiC? MOSFET 750 V G2,適用于汽車和工業功率電子應用
- DigiKey 慶祝 B 站賬號粉絲突破 10 萬,贈送驚喜禮包
- 碳化硅企業 Wolfspeed 啟動破產重組,預計 2025 年三季度末完成司法重整
- 蘋果被曝考慮放棄自研模型 轉而與Anthropic或OpenAI合作
- ?百度文心4.5來襲!英特爾Day0即支持端側部署
- 【廣瀨電機】關于中國發明專利侵權訴訟達成和解的公告
- 英飛凌BMS解決方案推動電動汽車創新
- 地平線的L3判斷與實踐路徑
- 汽車網絡升級攻略:CAN-CAN FD-車載以太網