亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

STM32F4移植ucos_II

2019-11-14 09:04:10
字體:
來源:轉載
供稿:網友

本篇目標:從搭建工程開始,一步步在 STM32F407ZGT6 上移植 ucos_ii 操作系統

材料準備:

stm32庫文件:stm32f4官方庫函數文件(stm32f4官網庫函數資料)ucos_ii源文件:ucos_ii操作系統官方源代碼文件(ucos_ii官網資料)移植工程:stm32f4移植ucos_II最終工程(stm32f4移植ucos_ii工程)

搭建stm32f4工程

建立如下文件夾,方便整理和拷貝: 建立工程1

解壓stm32庫函數包,進行文件的拷貝: (1)將 STM32F4xx_DSP_StdPeriph_Lib_V1.7.1/Libraries/STM32F4xx_ StdPeriph_Driver 文件夾下的兩個文件夾拷貝到fwlib文件夾; (2)將 Libraries/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm 文件夾下的 startup_stm32f40_41xxx.s 拷貝到startup文件夾; (3)將 Libraries/CMSIS/Device/ST/STM32F4xx/Source/Templates 文件夾下的 system_stm32f4xx.c 拷貝到misis文件夾; (4)將 Libraries/CMSIS/Device/ST/STM32F4xx/Include 文件夾下的兩個文件拷貝到misis文件夾; (5)將 Libraries/CMSIS/Include 文件夾下的 core_cm4.h 、core_cmFunc.h 、core_cmInstr.h 、core_cmSimd.h 拷貝到misis文件夾; (6)在 PRoject/STM32F4xx_StdPeriph_Examples 文件夾下隨便找一個工程例子,將其中的 main.c 、stm32f4xx_conf.h 、stm32f4xx_it.c 、stm32f4xx_it.h 拷貝到user文件夾;

建立keil工程如圖: keil1

keil工程修改: (1)刪除main.c所有內容,只寫一個main函數; (2)刪除stm32f4xx.h中的包含頭文件#inlcude”main.h”; (3)打開配置工程頁面;在output中勾上creat hex file;在C/C++中Define處輸入 STM32F40_41xxx,USE_STDPERIPH_DRIVER ;在C/C++中inlucde paths處添加所有頭文件的路徑,如圖; keil2

編譯,通過即可;


移植ucos_ii操作系統

在ucos_II文件下建立Ports和Source文件夾

解壓ucos_ii源代碼文件: (1)將 Micrium/Software/uCOS-II/Source 文件夾下的所有文件拷貝到Source文件夾; (2)將 Micrium/Software/uCOS-II/Ports/ARM-Cortex-M4/Generic/ RealView 文件夾下的所有文件拷貝到Ports文件夾; (3)將 Micrium/Examples/ST/STM3240G-EVAL/OS2 文件夾下的app_cfg.h 、os_cfg.h拷貝到user文件夾; (4)在user文件夾下創建sys_cfg.c 、sys_cfg.h新文件;

將文件添加進keil工程里面如圖: keil3

接下來開始修改ucos_ii源碼

注釋 app_cfg.h中的 #include “cpu.h”和 void App_SerPrintf (CPU_CHAR *format, …);(136-137行)

注釋 os_cpu.h 中的 void OS_CPU_SysTickHandler (void); 和 void OS_CPU_ SysTickInit (INT32U cnts);(185-186行)

打開文件 os_cfg.h ,修改 OS_APP_HOOKS_EN 的定義值為0(30行);修改 OS_TICKS_PER_SEC 的定義值為 1000(51行);修改 OS_MEM_EN 的定義值為1(98行);修改 OS_TMR_EN 的定義值為 1(139行);

打開文件os_cpu_c.c ,注釋 #include “lib_def.h”(53行);注釋 #if (OS_CPU_ARM_FP_EN == DEF_ENABLED) 與 #endif之間的所有內容(317-354行);注釋 OS_CPU_SysTickHandler 整個函數內容(461-473行);注釋 OS_CPU_SysTickInit 整個函數內容(488-507行);

打開文件startup_stm32f40_41xxx.s 文件,將所有的 PendSV_Handler 替換成 OS_CPU_PendSVHandler (共3處,替換前需要將文件的只讀屬性去掉才能夠修改文件);

打開stm32f4xx_it.c文件,添加頭文件 #include “ucos_ii.h”;找到 SysTick_Handler 函數(146行),添加以下程序:

void SysTick_Handler(void){ OSIntEnter(); OSTimeTick(); OSIntExit();}打開 sys_cfg.c 和 sys_cfg.h,編寫一些函數:

sys_cfg.c:

#include "stm32f4xx.h"#include "os_cfg.h"#include "sys_cfg.h"/*** * 函數名稱 : OS_CPU_SysTickInit(); * * 函數描述 : 滴答定時器設定; * * 傳遞值 : 無; * * 返回值 : 無; * **/void OS_CPU_SysTickInit(void){ RCC_ClocksTypeDef rcc_clocks; /* 獲取系統時鐘 */ RCC_GetClocksFreq(&rcc_clocks); /* 設置滴答定時器溢出計數值 */ SysTick_Config(rcc_clocks.HCLK_Frequency / OS_TICKS_PER_SEC);}void Sys_Config(void){}

sys_cfg.h:

#ifndef SYS_CFG_H#define SYS_CFG_Hvoid OS_CPU_SysTickInit(void);void Sys_Config(void);#endif

至此為止,ucos_ii的源碼修改結束,接下來就是ucos_ii初始化和任務的創建;


ucos_ii初始化

修改main.c文件,添加相關頭文件,添加任務相關宏定義,修改main函數如下:#include "app_cfg.h"#include "sys_cfg.h"#include "ucos_ii.h"#include "task_start.h"#define APP_TASK_START_PRIO 10u#define APP_TASK_START_STK_SIZE 128ustatic OS_STK App_TaskStartStk[APP_TASK_START_STK_SIZE];int main(void){ /* stm32系統初始化配置 */ Sys_Config(); /* ucos_ii初始化 */ OSInit(); /* 創建ucos_ii初始化任務 TASK_START */ OSTaskCreateExt(APP_TASK_START, (void *)0, (OS_STK *)&App_TaskStartStk [APP_TASK_START_STK_SIZE - 1], (INT8U )APP_TASK_START_PRIO, (INT16U )APP_TASK_START_PRIO, (OS_STK *)&App_TaskStartStk[0], (INT32U )APP_TASK_START_STK_SIZE, (void *)0, (INT16U)(OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR)); /* 開始 ucos_ii */ OSStart(); return 0;}在task文件夾下創建文件 task_start.c 和 task_start.h,并添加進keil工程,打開文件添加頭文件,宏定義,以及初始任務:

task_start.c:

#include "app_cfg.h"#include "sys_cfg.h"#include "ucos_ii.h"#include "stm32f4xx.h"#include "task_led.h"#define APP_TASK_USER_GREEN_PRIO 6u#define APP_TASK_USER_RED_PRIO 8u#define APP_TASK_USER_STK_SIZE 128ustatic OS_STK App_TaskGreenStk[APP_TASK_USER_STK_SIZE];static OS_STK App_TaskRedStk[APP_TASK_USER_STK_SIZE];static void APP_TASK_GREEN (void *p_arg);static void APP_TASK_RED (void *p_arg);/*** * 函數名稱 : APP_TASK_START(); * * 函數描述 : ucos_ii 初始化任務; * * 傳遞值 : 無; * * 返回值 : 無; * **/void APP_TASK_START(void *p_arg){ OS_CPU_SR cpu_sr; (void)p_arg; /* 配置滴答定時器,此函數調用位置為第一個創建任務開頭 */ OS_CPU_SysTickInit(); /* 關中斷 */ OS_ENTER_CRITICAL(); /* 創建綠燈任務 */ OSTaskCreateExt(APP_TASK_GREEN, (void *)0, (OS_STK *)&App_TaskGreenStk [APP_TASK_USER_STK_SIZE - 1], (INT8U )APP_TASK_USER_GREEN_PRIO, (INT16U )APP_TASK_USER_GREEN_PRIO, (OS_STK *)&App_TaskGreenStk[0], (INT32U )APP_TASK_USER_STK_SIZE, (void *)0, (INT16U )(OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR)); /* 創建紅燈任務 */ OSTaskCreateExt(APP_TASK_RED, (void *)0, (OS_STK *)&App_TaskRedStk [APP_TASK_USER_STK_SIZE - 1], (INT8U )APP_TASK_USER_RED_PRIO, (INT16U )APP_TASK_USER_RED_PRIO, (OS_STK *)&App_TaskRedStk[0], (INT32U )APP_TASK_USER_STK_SIZE, (void *)0, (INT16U )(OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR)); /* 刪除任務自身 */ OSTaskDel(OS_PRIO_SELF); /* 關中斷 */ OS_EXIT_CRITICAL();}

task_start.h:

#ifndef TASK_START_H#define TASK_START_Hvoid APP_TASK_START(void *p_arg);#endif

ucos_ii建立用戶任務

首先需要初始化stm32的GPIO口,在sys_cfg.c中修改和添加下列函數:/*** * 函數名稱 : GPIO_Configuration(); * * 函數描述 : GPIO初始化配置; * * 傳遞值 : 無; * * 返回值 : 無; * **/static void GPIO_Configuration(void){ GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG,ENABLE); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType=GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL; GPIO_Init(GPIOD, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9; GPIO_Init(GPIOG, &GPIO_InitStructure); /* 關閉所有燈 */ GPIO_ResetBits(GPIOD,GPIO_Pin_7); GPIO_ResetBits(GPIOG,GPIO_Pin_9);}/*** * 函數名稱 : Sys_Config(); * * 函數描述 : 系統初始化配置; * * 傳遞值 : 無; * * 返回值 : 無; * **/void Sys_Config(void){ /* 配置GPIO口 */ GPIO_Configuration();}在task文件夾下創建文件 task_led.c 和 task_led.h,并添加進keil工程,打開文件添加led任務函數:

task_led.c:

#include "stm32f4xx.h"#include "ucos_ii.h"#define LED_RED_OFF GPIO_ResetBits(GPIOD,GPIO_Pin_7);#define LED_RED_ON GPIO_SetBits(GPIOD,GPIO_Pin_7);#define LED_GREEN_OFF GPIO_ResetBits(GPIOG,GPIO_Pin_9);#define LED_GREEN_ON GPIO_SetBits(GPIOG,GPIO_Pin_9);/*** * 函數名稱 : APP_TASK_GREEN(); * * 函數描述 : 綠燈任務; * * 傳遞值 : 無; * * 返回值 : 無; * **/void APP_TASK_GREEN(void *p_arg){ for (;;) { /* 紅燈亮 */ LED_GREEN_ON; /* 延時0.5s,并任務切換 */ OSTimeDly(500); /* 紅燈滅 */ LED_GREEN_OFF; /* 延時0.5s,并任務切換 */ OSTimeDly(500); }}/*** * 函數名稱 : APP_TASK_RED(); * * 函數描述 : 紅燈任務; * * 傳遞值 : 無; * * 返回值 : 無; * **/void APP_TASK_RED(void *p_arg){ for (;;) { /* 紅燈亮 */ LED_RED_ON; /* 延時0.25s,并任務切換 */ OSTimeDly(250); /* 紅燈滅 */ LED_RED_OFF; /* 延時0.25s,并任務切換 */ OSTimeDly(250); }}

task_led.h:

#ifndef TASK_LED_H#define TASK_LED_Hvoid APP_TASK_GREEN (void *p_arg);void APP_TASK_RED (void *p_arg);#endif

至此,移植工作全部完成,編譯,下載;成功后會發現兩個led閃爍,就相當于兩個led燈的任務相互交替進行,互不影響;

小結:每個裸板移植 ucos_ii 方法都是想通的,整理覺得移植ucos_ii比較重要的幾個點:

滴答定時器的配置,包括滴答定時器的初始化配置其計數值,以及滴答定時器溢出中斷中函數的調用;任務調度,在每個創建的任務中必須使用延時函數、掛起函數或者刪除函數,才能使多個任務進行相互切換,調用的以上函數最終都會調用用匯編寫的任務切換函數 OSCtxSw() ,所以任務切換相關代碼也是重要的一部分;

總結:從移植 ucos_ii 到移植 lwip 經過了很漫長的過程,終于也算移植成功了,所以先寫了對 ucos_ii 的移植,之后再在此基礎上再寫 lwip 的移植,共勉


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国产精品福利| 日韩高清a**址| 永久免费看mv网站入口亚洲| 国产精品高清免费在线观看| 热门国产精品亚洲第一区在线| 美女av一区二区三区| 亚洲丝袜在线视频| 亚洲精品久久久一区二区三区| 日韩在线国产精品| 精品久久久久久亚洲精品| 国产精品中文字幕久久久| 国产一区二区三区毛片| 91高潮在线观看| 国产精品国产自产拍高清av水多| 日本一区二区三区在线播放| 亚洲偷欧美偷国内偷| 久久福利视频导航| 亚洲小视频在线| xxxx欧美18另类的高清| 精品亚洲va在线va天堂资源站| 色无极影院亚洲| 亚洲福利在线视频| 美女久久久久久久久久久| 国产乱人伦真实精品视频| 日韩精品免费一线在线观看| 亚洲精品欧美日韩专区| 午夜免费在线观看精品视频| 国产一区二区三区视频| 亚洲已满18点击进入在线看片| 影音先锋欧美在线资源| 欧洲日本亚洲国产区| 国产精品流白浆视频| 在线视频亚洲欧美| 欧美极品美女视频网站在线观看免费| 尤物yw午夜国产精品视频明星| 亚洲最新av网址| 国产精品69久久| 国产精品成人国产乱一区| 欧美老女人在线视频| 久久精品一偷一偷国产| 欧美中文字幕在线| 一区二区成人av| 国产精品久久综合av爱欲tv| 亚洲伊人久久大香线蕉av| 亚洲女同精品视频| 国产一区二区日韩| 国产欧美日韩最新| 4k岛国日韩精品**专区| 亚洲女人被黑人巨大进入al| 91精品国产免费久久久久久| 国产精品久久久久久久久借妻| 中文字幕日韩av| 26uuu另类亚洲欧美日本老年| 成人在线视频福利| 日韩av一区二区在线观看| 久久九九国产精品怡红院| 亚洲精品欧美极品| 欧美性猛交xxxx免费看| 亚洲欧美三级伦理| 亚洲理论在线a中文字幕| 亚洲精品视频播放| 亚洲国产成人久久综合| 日韩美女视频免费在线观看| 亚洲在线一区二区| 97超碰色婷婷| 最近2019中文字幕mv免费看| 欧美成aaa人片免费看| 欧美乱大交做爰xxxⅹ性3| 91色中文字幕| 亚洲精品视频播放| 91精品91久久久久久| 欧美在线视频一区二区| 亚洲欧美日本精品| 亚洲免费一级电影| 91沈先生在线观看| 欧日韩不卡在线视频| 日韩精品极品视频免费观看| 欧美成人精品三级在线观看| 国产精品偷伦视频免费观看国产| 国产精品久久久久久av福利| 97香蕉久久超级碰碰高清版| 国产精品久久久久久五月尺| 久久精品久久久久| 欧美一级高清免费播放| 久久6精品影院| 亚洲国产精品系列| 久久艳片www.17c.com| 亚洲成人999| 国产精品一区二区女厕厕| 日韩经典中文字幕| 国产亚洲a∨片在线观看| 成人久久18免费网站图片| 日韩欧美福利视频| 亚洲乱码av中文一区二区| 国产日韩精品在线播放| 日韩欧美黄色动漫| 日韩一区二区三区在线播放| 亚洲电影免费观看高清完整版在线观看| 中文字幕国产日韩| 日韩高清电影免费观看完整版| 国产日韩精品在线观看| 91黄色8090| 一本一本久久a久久精品综合小说| 亚洲成人激情在线| 日本最新高清不卡中文字幕| 久久人91精品久久久久久不卡| 另类天堂视频在线观看| 久久精品国产综合| 亚洲精品电影网| 97在线视频免费播放| 日韩黄在线观看| 7777免费精品视频| 国产丝袜一区二区三区| 亚洲免费一级电影| 亚洲免费精彩视频| 欧美日韩在线免费观看| 欧美午夜精品久久久久久人妖| 9.1国产丝袜在线观看| 亚洲成av人影院在线观看| 中文字幕欧美视频在线| 欧美黑人性视频| 国产精品1区2区在线观看| 国产偷国产偷亚洲清高网站| 亚洲欧美制服另类日韩| 久久久噜噜噜久噜久久| 亚洲人成网站999久久久综合| 国产美女久久久| 91久久久久久| 亚洲开心激情网| 国产区亚洲区欧美区| 久久成人在线视频| 久久成人18免费网站| 久久97久久97精品免视看| 中文字幕在线观看亚洲| 久久久久久噜噜噜久久久精品| 亚洲国产成人精品久久久国产成人一区| 精品成人国产在线观看男人呻吟| 国产精品jizz在线观看麻豆| 欧美巨乳在线观看| y97精品国产97久久久久久| 日韩中文字幕免费看| 91中文字幕在线| 中文在线资源观看视频网站免费不卡| 午夜欧美大片免费观看| 久久福利视频导航| 成人午夜激情网| 国产精品高潮呻吟久久av无限| 538国产精品一区二区在线| 国产成人久久久精品一区| 91探花福利精品国产自产在线| 国产成人精彩在线视频九色| 国产91免费观看| 亚洲精品欧美日韩| 欧美电影在线观看| 久久国产精品亚洲| 精品亚洲一区二区三区| 奇米一区二区三区四区久久| 精品久久久久久亚洲精品| 视频在线观看一区二区| 亚洲精品动漫100p| 97超碰蝌蚪网人人做人人爽| 国产成人aa精品一区在线播放| 中文字幕亚洲国产| 亚洲天堂免费观看|