久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3617|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

STM32移植uCOS-II筆記

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:85681 發(fā)表于 2015-7-15 02:00 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
首先從st公司的網(wǎng)站下載最新的stm32標(biāo)準(zhǔn)外設(shè)庫3.5 ,再從micrium網(wǎng)站上下載官方移植版本(編譯器使用ARM/Keil的,V2.86版本,V2.85有問題),然后就是我們MDK建立工程了,工程結(jié)構(gòu)組織如下:

其中  uCOSII_core 是uCOS的內(nèi)核文件,與平臺無關(guān),所以無需修改。
在移植
uCOS-II時(shí)我們只需要關(guān)注  uCOSII_port 中三個(gè)文件和stm32f10x_it.c就可以了:
第一個(gè)文件就是 os_cpu.h
1.  
定義與編譯器相關(guān)的數(shù)據(jù)類型,無需修改
typedef unsigned char   BOOLEAN;

typedef unsigned char    INT8U;                    /* Unsigned  8 bit quantity                           */
typedef signed   char      INT8S;                    /* Signed    8 bit quantity                           */
typedef unsigned short  INT16U;                   /* Unsigned 16 bit quantity                           */
typedef signed   short     INT16S;                   /* Signed   16 bit quantity                           */
typedef unsigned int       INT32U;                   /* Unsigned 32 bit quantity                           */
typedef signed   int         INT32S;                   /* Signed   32 bit quantity                           */
typedef float                     FP32;                     /* Single precision floating point                    */
typedef double                FP64;                     /* Double precision floating point                    */
typedef unsigned int      OS_STK;                   /* Each stack entry is 32-bit wide                    */
typedef unsigned int      OS_CPU_SR;                /* Define size of CPU status register (PSR = 32 bits) */

2.  因?yàn)镃M3是32位寬的,所以O(shè)S_STK(堆棧的數(shù)據(jù)類型)被類型重定義為unsigned int。  因?yàn)镃M3的狀態(tài)寄存器(xPSR)是32位寬的,因此OS_CPU_SR被類型重定義為unsigned int。OS_CPU_SR是在OS_CRITICAL_METHOD方法3中保存cpu狀態(tài)寄存器用的。在CM3中,移植OS_ENTER_CRITICAL(),OS_EXIT_CRITICAL()選方法3是最合適的。
#define  OS_CRITICAL_METHOD   3
typedef unsigned int OS_STK;
  typedef unsigned int OS_CPU_SR;

3.  μC/OS-II定義了三種方法關(guān)閉和打開中斷 (OS_CRITICAL_METHED=1,2,3),通常情況下,我們都是選用的方法3,這里定義了兩個(gè)宏來禁止和允許中斷
#if OS_CRITICAL_METHOD == 3
#define  OS_ENTER_CRITICAL()  {cpu_sr = OS_CPU_SR_Save();}
#define  OS_EXIT_CRITICAL()      {OS_CPU_SR_Restore(cpu_sr);}
#endif     
具體定義宏OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL(),其中OS_CPU_SR_Save() //關(guān)中斷
和OS_CPU_SR_Restore() //開中斷
是用匯編代碼寫的,代碼在os_cpu_a.asm中。

4.  
定義棧的增長方向
#define  OS_STK_GROWTH        1
置OS_STK_GROWTH為0,表示堆棧從下往上增長;置OS_STK_GROWTH為1,表示堆棧從上往下增長。

5.  
定義OS_TASK_SW()宏,任務(wù)級上下文切換
#define  OS_TASK_SW()         OSCtxSw()
任務(wù)級上下文切換(即任務(wù)切換)調(diào)用宏定義OS_TASK_SW()。因?yàn)樯舷挛那袚Q跟處理器有密切關(guān)系,OS_TASK_SW()實(shí)質(zhì)上是調(diào)用匯編函數(shù)OSCtxSW() ,它在os_cpu_a.asm 文件中定義。

6.  注釋掉如下函數(shù),并添加void  PendSV_Handler(void)的函數(shù)聲明
#if OS_CRITICAL_METHOD == 3                    
OS_CPU_SR  OS_CPU_SR_Save(void);
void       OS_CPU_SR_Restore(OS_CPU_SR cpu_sr);
#endif


void       OSCtxSw(void);
void       OSIntCtxSw(void);
void       OSStartHighRdy(void);
void       PendSV_Handler(void);


// void         OS_CPU_PendSVHandler(void);                                             
// void         OS_CPU_SysTickHandler(void);
// void         OS_CPU_SysTickInit(void);                                                
// INT32U     OS_CPU_SysTickClkFreq(void);
申明幾個(gè)函數(shù),這里要注意最后四個(gè)函數(shù)需要注釋掉,為什么呢?  
OS_CPU_SysTickHandler()定義在os_cpu_c.c中,是SysTick中斷的中斷處理函數(shù),而stm32f10x_it.c,中已經(jīng)有該中斷函數(shù)的定義SysTick_Handler(),這里也就不需要了。
OS_CPU_SysTickInit()定義在os_cpu_c.c中,用于初始化SysTick定時(shí)器,它依賴于OS_CPU_SysTickClkFreq(),而此函數(shù)我們自己會實(shí)現(xiàn),所以注釋掉。  
OS_CPU_SysTickClkFreq()定義在BSP.C (Micrium\Software\EvalBoards)中,而本文移植中并未用到BSP.C,后面我們會自己實(shí)現(xiàn),因此可以把它注釋掉。
OS_CPU_PendSVHandler()在啟動文件上,一般我們自己開發(fā)基于stm32芯片的軟件,都會使用標(biāo)準(zhǔn)外設(shè)庫CMSIS中提供的啟動文件,而官方移植的啟動文件卻是自己寫的,在兩個(gè)文件init.s,vectors.s中 (Micrium\Software\EvalBoards\ST\STM3210B-EVAL\RVMDK)。init.s負(fù)責(zé)進(jìn)入main(),vectors.s設(shè)置中斷向量。OS_CPU_SysTickHandler和OS_CPU_PendSVHandler就是在vectors.s中被設(shè)置的。  我的移植是使用標(biāo)準(zhǔn)外設(shè)庫CMSIS中startup_stm32f10x_md.s作為啟動文件的,那該怎么在這個(gè)文件中設(shè)置OS_CPU_SysTickHandler呢,事實(shí)上在startup_stm32f10x_md .s文件中,PendSV中斷向量名為PendSV_Handler,所以只需用PendSV_Handler把所有出現(xiàn)OS_CPU_PendSVHandler 的地方替換掉就可以了。
我們有提到在
startup_stm32f10x_md .s中我們有定義PendSV_Handler,其中PendSV_Handler函數(shù)在我們CM3中也有實(shí)現(xiàn),就在stm32f10x_it.c和stm32f10x_it.h中,現(xiàn)在我們選擇使用uCOS的PendSV_Handler函數(shù),所以應(yīng)該將stm32f10x_it.c和stm32f10x_it.h中的PendSV_Handler函數(shù)注釋起來。



第二個(gè)文件就是 os_cpu_c.c
1.   ucosii移植時(shí)需要我們寫10個(gè)相當(dāng)簡單的C函數(shù)。
OSInitHookBegin()
OSInitHookEnd()
OSTaskCreateHook()
OSTaskDelHook()
OSTaskIdleHook()
OSTaskStatHook()
OSTaskStkInit()
OSTaskSwHook()
OSTCBInitHook()
OSTimeTickHook()
這些函數(shù)除了OSTaskStkInit(),都是一些hook函數(shù)。這些hook函數(shù)如果不使能的話,都不會用上,也都比較簡單,看看就應(yīng)該明白了,所以就不介紹.
OS_STK *OSTaskStkInit (void (*task)(void *p_arg), void *p_arg, OS_STK *ptos, INT16U opt)
{
    OS_STK *stk;
    (void)opt;                                   /* 'opt' is not used, prevent warning                 */
    stk       = ptos;                            /* Load stack pointer                                 */
                                                       /* Registers stacked as if auto-saved on exception    */
    *(stk)    = (INT32U)0x01000000L;             /* xPSR                                               */
    *(--stk)  = (INT32U)task;                    /* Entry Point                                        */
    *(--stk)  = (INT32U)0xFFFFFFFEL;           /* R14 (LR) (init value will cause fault if ever used)*/
    *(--stk)  = (INT32U)0x12121212L;             /* R12                                                */
    *(--stk)  = (INT32U)0x03030303L;             /* R3                                                 */
    *(--stk)  = (INT32U)0x02020202L;             /* R2                                                 */
    *(--stk)  = (INT32U)0x01010101L;             /* R1                                                 */
    *(--stk)  = (INT32U)p_arg;                         /* R0 : argument                                      */
                                                                       /* Remaining registers saved on process stack         */
    *(--stk)  = (INT32U)0x11111111L;             /* R11                                                */
    *(--stk)  = (INT32U)0x10101010L;             /* R10                                                */
    *(--stk)  = (INT32U)0x09090909L;             /* R9                                                 */
    *(--stk)  = (INT32U)0x08080808L;             /* R8                                                 */
    *(--stk)  = (INT32U)0x07070707L;             /* R7                                                 */
    *(--stk)  = (INT32U)0x06060606L;             /* R6                                                 */
    *(--stk)  = (INT32U)0x05050505L;             /* R5                                                 */
    *(--stk)  = (INT32U)0x04040404L;             /* R4                                                 */


    return (stk);
}
xPSR,PC,LR,R12,R3-R0被自動保存到棧中的,R11-R4如果需要保存,只能手工保存。因此OSTaskStkInit()的工作就是在任務(wù)自己的棧中保存cpu的所有寄存器。這些值里R1-R12都沒什么意義,這里用相應(yīng)的數(shù)字代號(如R1用0x01010101)主要是方便調(diào)試.
其他的幾個(gè)函數(shù)都可以空著,例如:
#if (OS_CPU_HOOKS_EN > 0) && (OS_TASK_SW_HOOK_EN > 0)
void  OSTaskSwHook (void)
{
#if OS_APP_HOOKS_EN > 0
    App_TaskSwHook();
#endif
}
#endif

2. 注釋掉其中的一些內(nèi)容
把OS_CPU_SysTickHandler(), OS_CPU_SysTickInit()注釋掉。  

把上面這些宏定義也注釋掉,因?yàn)樗鼈兌加糜贠S_CPU_SysTickHandler(),  OS_CPU_SysTickInit()。

第三個(gè)文件就是我們前面提到過的
os_cpu_a.asm
在os_cpu_a.asm中定義了4個(gè)與處理器相關(guān)的匯編函數(shù),我們是從micrium網(wǎng)站上下載官方移植版本,所以其中的函數(shù)都已經(jīng)實(shí)現(xiàn)了,如果需要了解的可以參照 《Cortex-M3權(quán)威指南》。
我們在注釋掉os_cpu.h中的OS_CPU_PendSVHandler() 提到需用PendSV_Handler把所有出現(xiàn)OS_CPU_PendSVHandler 的地方替換掉,而這些需要替換掉的內(nèi)容就在os_cpu_a.asm中,只需將下面的地方替換就好了


第四個(gè)文件就是我們的 stm32f10x_it.c
在前面修改os_cpu.h 文件時(shí)注釋過一個(gè)
OS_CPU_SysTickHandler()是因?yàn)檫@個(gè)函數(shù)是提供系統(tǒng)時(shí)鐘中斷的,而在我們CM3中已經(jīng)有了自己的系統(tǒng)時(shí)鐘中斷函數(shù),就是 stm32f10x_it.c 的void SysTick_Handler(void),在這里只需要把OS_CPU_SysTickHandler() 的內(nèi)容復(fù)制給SysTick_Handler()即可(記得把頭文件包含進(jìn)來 ):



到這里為止我們的移植就算是完成了,接下來任務(wù)就是在app.c文件中實(shí)現(xiàn)我們的測試程序了
#include "includes.h"


static OS_STK task_led1_stk[LED1_TASK_STK_SIZE];


static void systick_init(void)
{
RCC_ClocksTypeDef rcc_clock;
RCC_GetClocksFreq(&rcc_clock);
SysTick_Config(rcc_clock.HCLK_Frequency/OS_TICKS_PER_SEC);
}


void LED1_Tast(void *p_arg)
{
p_arg=p_arg;


while(1)
{
GPIO_WriteBit(GPIOA, GPIO_Pin_15, Bit_RESET);
OSTimeDlyHMSM(0, 0,1,0);
GPIO_WriteBit(GPIOA, GPIO_Pin_15, Bit_SET);
OSTimeDlyHMSM(0, 0,1,0);
}

int main(void)
{
BSP_Init();
OSInit();
systick_init();
OSTaskCreate(LED1_Tast,( void *)0,&task_led1_stk[LED1_TASK_STK_SIZE-1],LED1_TASK_PRIO);
OSStart();
return 0;
}

如果LED燈出現(xiàn)閃爍的話就大功告成了!








分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美另类视频 | 中文字幕在线一区 | 欧美国产日韩一区二区三区 | 亚洲精品中文在线 | 国产一级精品毛片 | 日韩高清国产一区在线 | 日本精品视频 | 91精品国产91久久久久久三级 | 一级毛片在线播放 | 在线天堂免费中文字幕视频 | 亚洲 欧美 日韩在线 | 天天夜天天操 | www日韩欧美 | 99久久精品免费看国产四区 | 免费黄篇| 久久久久久国产精品免费免费狐狸 | 中文字幕欧美一区 | 男女一区二区三区 | 国产成人免费视频网站高清观看视频 | 激情一区二区三区 | 午夜精品久久久久久久久久久久 | 中文字幕人成乱码在线观看 | 日韩高清一区 | 精品一区二区久久久久久久网站 | 欧美日韩精品久久久免费观看 | 国产成人精品一区二区三区在线 | 欧美成年人视频在线观看 | 天天玩夜夜操 | 97超碰站 | 狠狠操狠狠搞 | 亚洲成人网在线观看 | 亚洲性人人天天夜夜摸 | 成人在线电影网站 | 中文字幕不卡视频在线观看 | 国产免费一区二区三区免费视频 | 日韩手机在线视频 | 日韩av一区二区在线观看 | 99精品久久久久久 | 国产精品久久毛片av大全日韩 | 中文在线一区二区 | 久久久久久久久国产成人免费 |