uCos-III移植到STM32F10x
最近在百度上看了uCOS-III 的介绍后,诸多功能有很大的提升和改进,感觉有必要升级一下开发环境。百度介绍:http://baike.baidu.com/view/8531313.htm
环境:
- STM32F10x 3.5固件库。
- MDK4.23 编译器
- uCos-III v3.03
1. uCos-III 源文件KRN-K3XX-000000.zip
官网http://micrium.com/page/downloads/source_code
我的网盘:http://115.com/file/anr4r6a8#
2.uCos-III 官网 移植程序
Micrium_uCOS-III-STM32F107-Eval-Atollic-TrueSTUDIO.zip
官网http://micrium.com/download/Micrium-Book-uCOS-III-STM32F107.exe
网盘http://115.com/file/dpuyusej#
一、第一步新建工程(在上一篇文章中有详解)
二、新建文件夹uCOS_III。在此文件下新建四个文件夹uC-CPU,uC-LIB, uCOS-III。
1.uCOS-III下新建三个文件 Source, Ports, Cfg
复制KRN-K3XX-000000\Micrium\Software\uCOS-III\Source下所有文件到Source;
复制KRN-K3XX-000000\Micrium\Software\uCOS-III\Cfg\Template下所有文件到Cfg;
复制Micrium_uCOS-III-STM32F107-Eval-Atollic-TrueSTUDIO\Micrium\Software\uCOS-III\Ports\ARM-Cortex-M3\Generic\RealVie下所有文件到 Ports。
2. uC-LIB下新建三个文件 Source, Ports, Cfg
复制Micrium_uCOS-III-STM32F107-Eval-Atollic-TrueSTUDIO\Micrium\Software\uC-LIB文本文件到Source
复制Micrium_uCOS-III-STM32F107-Eval-Atollic-TrueSTUDIO\Micrium\Software\uC-LIB\Cfg\Template下 lib_cfg.h 到Cfg
复制Micrium_uCOS-III-STM32F107-Eval-Atollic-TrueSTUDIO\Micrium\Software\uC-LIB\Ports\ARM-Cortex-M3\RealView 下lib_mem_a.asm 到Ports
3. uC-CPU下新建三个文件 Source, Ports,Cfg
复制Micrium_uCOS-III-STM32F107-Eval-Atollic-TrueSTUDIO\Micrium\Software\uC-CPU下三个文本文件到Source
复制Micrium_uCOS-III-STM32F107-Eval-Atollic-TrueSTUDIO\Micrium\Software\uC-CPU\ARM-Cortex-M3\GNU下三个文件到 Ports
复制Micrium_uCOS-III-STM32F107-Eval-Atollic-TrueSTUDIO\Micrium\Software\EvalBoards\Micrium\uC-Eval-STM32F107\Atollic\uCOS-III\APP下cpu_cfg.h 到Cfg
4.复制Micrium_uCOS-III-STM32F107-Eval-Atollic-TrueSTUDIO\Micrium\Software\EvalBoards\Micrium\uC-Eval-STM32F107\Atollic\uCOS-III\APP下app_cfg.h 到Main中。
好了, 到这里工程文件以复制完了。
1.把工程引用文件路径指定 参图:
2.添加工程文件:
Main.c, Kernel.c,Kernel.h,Config.c,Config.h代码如下提供。
1 #include "os.h" 2 #include "Kernel.h" 3 #include "Config.h" 4 5 int main() 6 { 7 SystemConfigInit(); 8 KeranlTask(); 9 10 return 0; 11 }
1 /*------------------------------------------------------------------------- 2 3 软件主体 4 5 6 -------------------------------------------------------------------------*/ 7 8 #include "os.h" 9 #include "kernel.h" 10 #include "config.h" 11 12 extern void SysTickInit(void); 13 14 static OS_TCB taskStartTCB; 15 static CPU_STK startTaskStk[STARTUP_TASK_STK_SIZE]; //启动任务的程序空间 16 17 static OS_TCB task1TCB; 18 static CPU_STK task1_stk[TASK1_STK_SIZE]; 19 20 static OS_TCB task2TCB; 21 static CPU_STK task2_stk[TASK2_STK_SIZE]; 22 23 static OS_TCB task3TCB; 24 static CPU_STK task3_stk[TASK3_STK_SIZE]; 25 26 static volatile OS_SEM taskSem; 27 static volatile OS_ERR err; 28 29 /******************************************************************************* 30 * Function Name :void StartTask(void) 31 * Description :启动任务 32 * Input : 33 * Output : 34 * Other : 35 * Date :2012.04.18 11:48:23 36 *******************************************************************************/ 37 void StartTask(void) 38 { 39 40 led_init(); 41 SysTickInit(); 42 43 OSTaskCreate( (OS_TCB *)&task1TCB, 44 (CPU_CHAR *)"task1", 45 (OS_TASK_PTR)task1, 46 (void *)0, 47 (OS_PRIO )TASK1_PRIO, 48 (CPU_STK *)&task1_stk[0], 49 (CPU_STK_SIZE)TASK1_STK_SIZE / 10, 50 (CPU_STK_SIZE)TASK1_STK_SIZE, 51 (OS_MSG_QTY )0, 52 (OS_TICK )0, 53 (void *)0, 54 (OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR), 55 (OS_ERR *)&err); 56 57 OSTaskCreate( (OS_TCB *)&task2TCB, 58 (CPU_CHAR *)"task2", 59 (OS_TASK_PTR)task2, 60 (void *)0, 61 (OS_PRIO ) TASK2_PRIO, 62 (CPU_STK *)&task2_stk[0], 63 (CPU_STK_SIZE)TASK2_STK_SIZE / 10, 64 (CPU_STK_SIZE)TASK2_STK_SIZE, 65 (OS_MSG_QTY)0, 66 (OS_TICK )0, 67 (void *)0, 68 (OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR), 69 (OS_ERR *)&err); 70 71 72 OSTaskCreate( (OS_TCB *)&task3TCB, 73 (CPU_CHAR *)"task3", 74 (OS_TASK_PTR)task3, 75 (void *)0, 76 (OS_PRIO )TASK3_PRIO, 77 (CPU_STK *)&task3_stk[0], 78 (CPU_STK_SIZE)TASK3_STK_SIZE / 10, 79 (CPU_STK_SIZE)TASK3_STK_SIZE, 80 (OS_MSG_QTY)0, 81 (OS_TICK )0, 82 (void *)0, 83 (OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR), 84 (OS_ERR *)&err); 85 86 OSSemCreate( (OS_SEM *)&taskSem, 87 (CPU_CHAR *)"taskSem", 88 (OS_SEM_CTR)0, 89 (OS_ERR *)err); 90 91 OSTaskDel( (OS_TCB *)&taskStartTCB, 92 (OS_ERR *)&err); 93 } 94 95 static void task1(void *p_arg) 96 { 97 98 while (1) 99 { 100 led_on(LED_4); 101 OSTimeDly( (OS_TICK )200, 102 (OS_OPT )OS_OPT_TIME_DLY, 103 (OS_ERR *)&err); 104 105 led_off(LED_4); 106 OSTimeDly( (OS_TICK )200, 107 (OS_OPT )OS_OPT_TIME_DLY, 108 (OS_ERR *)&err); 109 110 OSSemPost( (OS_SEM *)&taskSem, 111 (OS_OPT )OS_OPT_POST_ALL, 112 (OS_ERR *)&err); 113 114 } 115 } 116 117 static void task2(void *p_arg) 118 { 119 while (1) 120 { 121 led_on(LED_5); 122 OSSemPend( (OS_SEM *)&taskSem, 123 (OS_TICK )10000, 124 (OS_OPT )OS_OPT_PEND_BLOCKING, 125 (CPU_TS *)0, 126 (OS_ERR *)&err); 127 128 led_off(LED_5); 129 OSSemPend( (OS_SEM *)&taskSem, 130 (OS_TICK )10000, 131 (OS_OPT )OS_OPT_PEND_BLOCKING, 132 (CPU_TS *)0, 133 (OS_ERR *)&err); 134 135 } 136 } 137 138 static void task3(void *p_arg) 139 { 140 141 while (1) 142 { 143 led_on(LED_3); 144 OSTimeDly( (OS_TICK )100, 145 (OS_OPT )OS_OPT_TIME_DLY, 146 (OS_ERR *)&err); 147 148 led_off(LED_3); 149 OSTimeDly( (OS_TICK )100, 150 (OS_OPT )OS_OPT_TIME_DLY, 151 (OS_ERR *)&err); 152 153 } 154 } 155 156 157 /******************************************************************************* 158 * Function Name :void KeranlTask(void) 159 * Description :启动任务 160 * Input : 161 * Output : 162 * Other : 163 * Date :2012.04.18 11:05:47 164 *******************************************************************************/ 165 void KeranlTask(void) 166 { 167 CPU_Init(); 168 OSInit((OS_ERR *)&err); 169 170 OSTaskCreate( (OS_TCB *)&taskStartTCB, 171 (CPU_CHAR *)"task_start", 172 (OS_TASK_PTR)StartTask, 173 (void *)0, 174 (OS_PRIO ) STARTUP_TASK_PRIO, 175 (CPU_STK *)&startTaskStk[0], 176 (CPU_STK_SIZE)STARTUP_TASK_STK_SIZE / 10, 177 (CPU_STK_SIZE)STARTUP_TASK_STK_SIZE, 178 (OS_MSG_QTY)0, 179 (OS_TICK )0, 180 (void *)0, 181 (OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR), 182 (OS_ERR *)&err); 183 184 OSStart((OS_ERR *)&err); 185 }
1 #ifndef _kernel_h_ 2 #define _kernel_h_ 3 4 #include "os.h" 5 6 7 8 9 10 11 12 static void task1(void *p_arg); 13 static void task2(void *p_arg); 14 static void task3(void *p_arg); 15 16 void KeranlTask(void); 17 18 19 #endif
1 /* 2 ******************************************************************************** 3 * uC/OS-II 4 * 5 * ARM Cortex-M3 Port 6 * 7 * File : Config.C 8 * Version : V1.0 9 * By : 王宏强 10 * 11 * For : Stm32f10x 12 * Mode : Thumb2 13 * Toolchain : 14 * RealView Microcontroller Development Kit (MDK) 15 * Keil uVision 16 * Description : STM32F10x 内部 系统的配置 17 * 18 * 1,系统中断优先级模式设置 19 * 2,系统程序启动指定 20 * 3,系统时钟计时器配置 21 * 4,芯片引脚初始化 22 * 23 * Date : 2012.05.22 24 *******************************************************************************/ 25 26 #include "misc.h" 27 #include "stm32f10x_gpio.h" 28 #include "stm32f10x_flash.h" 29 #include "stm32f10x_rcc.h" 30 #include "stm32f10x_iwdg.h" 31 #include "config.h" 32 33 34 GPIO_InitTypeDef GPIO_InitStructure; 35 /******************************************************************************* 36 * Function Name : GPIO_Configuration 37 * Description : Configures the different GPIO ports. 38 * Input : None 39 * Output : None 40 * Return : None 41 *******************************************************************************/ 42 void GPIO_Configuration(void) 43 { 44 #ifdef USE_STM3210B_EVAL 45 /* Enable the USART2 Pins Software Remapping */ 46 GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE); 47 #endif 48 49 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | 50 RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | 51 RCC_APB2Periph_GPIOE, ENABLE); 52 53 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; 54 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; 55 GPIO_Init(GPIOA, &GPIO_InitStructure); 56 GPIO_Init(GPIOB, &GPIO_InitStructure); 57 GPIO_Init(GPIOC, &GPIO_InitStructure); 58 GPIO_Init(GPIOD, &GPIO_InitStructure); 59 GPIO_Init(GPIOE, &GPIO_InitStructure); 60 61 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | 62 RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | 63 RCC_APB2Periph_GPIOE, DISABLE); 64 65 } 66 67 68 /******************************************************************************* 69 * Function Name : Delay 70 * Description : Inserts a delay time. 71 * Input : nCount: specifies the delay time length. 72 * Output : None 73 * Return : None 74 *******************************************************************************/ 75 void Delay(volatile CPU_INT32U nCount) 76 { 77 for(; nCount != 0; nCount--); 78 } 79 80 /******************************************************************************* 81 函 数 名:void IWDG_Init(void) 82 功能描述:看门狗初始化 83 入口参数: 84 返回参数: 85 创建时间: 2011.6.24 86 ********************************************************************************/ 87 void IWDG_Init(void) 88 { 89 90 IWDG_WriteAccessCmd( IWDG_WriteAccess_Enable ); 91 IWDG_SetPrescaler( IWDG_Prescaler_64); //最小 92 IWDG_SetReload( 0x138); //40KHz内部时钟 0.5s 93 IWDG_WriteAccessCmd( IWDG_WriteAccess_Disable ); 94 IWDG_Enable(); 95 IWDG_ReloadCounter(); 96 } 97 98 /******************************************************************************* 99 * Function Name :void SysTickInit(void) 100 * Description :系统定时器时间配置 101 * Input : 102 * Output : 103 * Other :时基为1ms 104 * Date :2011.11.03 12:59:13 105 *******************************************************************************/ 106 void SysTickInit(void) 107 { 108 SysTick_Config(SystemCoreClock / 1000); //uCOS时基1ms 109 } 110 /******************************************************************************* 111 * Function Name :void InterruptOrder(void) 112 * Description :中断向量,优先级 113 * Input : 114 * Output : 115 * Other : 116 * Date :2011.10.27 11:50:05 117 *******************************************************************************/ 118 void NVIC_Configuration(void) 119 { 120 NVIC_PriorityGroupConfig( NVIC_PriorityGroup_1 );//优先级设置 121 } 122 123 /******************************************************************************* 124 * Function Name :void SystemConfig(void) 125 * Description :系统初始化 126 * Input : 127 * Output : 128 * Other : 129 * Date :2011.10.27 13:14:59 130 *******************************************************************************/ 131 void SystemConfigInit(void) 132 { 133 NVIC_Configuration(); //中断优先级设置 134 GPIO_Configuration(); //端口初始化,所有端口关 135 } 136 137 138 139 140 void led_init(void) 141 { 142 GPIO_InitTypeDef GPIO_InitStructure; 143 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE); 144 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13; 145 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 146 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; 147 GPIO_Init(GPIOA, &GPIO_InitStructure); 148 149 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9; 150 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 151 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; 152 GPIO_Init(GPIOB, &GPIO_InitStructure); 153 } 154 155 void led_on(CPU_INT32U n) 156 { 157 switch (n) 158 { 159 case LED_0: 160 GPIO_SetBits(GPIOD, GPIO_Pin_2); 161 break; 162 case LED_1: 163 GPIO_SetBits(GPIOD, GPIO_Pin_3); 164 break; 165 case LED_2: 166 GPIO_SetBits(GPIOD, GPIO_Pin_4); 167 break; 168 case LED_3: 169 GPIO_SetBits(GPIOB, GPIO_Pin_9); 170 break; 171 case LED_4: 172 GPIO_SetBits(GPIOA, GPIO_Pin_12); 173 break; 174 case LED_5: 175 GPIO_SetBits(GPIOA, GPIO_Pin_11); 176 break; 177 default: 178 break; 179 } 180 } 181 182 183 void led_off(CPU_INT32U n) 184 { 185 switch (n) 186 { 187 case LED_0: 188 GPIO_ResetBits(GPIOD, GPIO_Pin_2); 189 break; 190 case LED_1: 191 GPIO_ResetBits(GPIOD, GPIO_Pin_3); 192 break; 193 case LED_2: 194 GPIO_ResetBits(GPIOD, GPIO_Pin_4); 195 break; 196 case LED_3: 197 GPIO_ResetBits(GPIOB, GPIO_Pin_9); 198 break; 199 case LED_4: 200 GPIO_ResetBits(GPIOA, GPIO_Pin_12); 201 break; 202 case LED_5: 203 GPIO_ResetBits(GPIOA, GPIO_Pin_11); 204 break; 205 default: 206 break; 207 } 208 }
1 /****************************************Copyright (c)************************************************** 2 ** Modified by: 王宏强 3 ** Modified date: 2012-05-20 4 ** Version: v3.0 5 ** Descriptions: 修改用于STM32F10x 6 ** 7 **------------------------------------------------------------------------------------------------------ 8 ** Modified by: 9 ** Modified date: 10 ** Version: 11 ** Descriptions: 12 ** 13 ********************************************************************************************************/ 14 #include "os.h" 15 16 17 /********************************/ 18 /* 系统配置函数 */ 19 /********************************/ 20 #define LED_0 0 21 #define LED_1 1 22 #define LED_2 2 23 #define LED_3 3 24 #define LED_4 4 25 #define LED_5 5 26 27 28 void Delay(volatile CPU_INT32U nCount); 29 void IWDG_Init(void); 30 void SysTickInit(void); 31 void SystemConfigInit(void); 32 void led_init(void); 33 void led_on(CPU_INT32U n); 34 void led_off(CPU_INT32U n); 35 36 37 38 39 40 41 42 43 /******************************************************************************************************** 44 ** End Of File 45 ********************************************************************************************************/
app_cfg.h 追加代码 后如下:
1 /* 2 ********************************************************************************************************* 3 * EXAMPLE CODE 4 * 5 * (c) Copyright 2003-2007; Micrium, Inc.; Weston, FL 6 * 7 * All rights reserved. Protected by international copyright laws. 8 * Knowledge of the source code may NOT be used to develop a similar product. 9 * Please help us continue to provide the Embedded community with the finest 10 * software available. Your honesty is greatly appreciated. 11 ********************************************************************************************************* 12 */ 13 14 /* 15 ********************************************************************************************************* 16 * 17 * APPLICATION CONFIGURATION 18 * 19 * ST Microelectronics STM32 20 * on the 21 * 22 * Micrium uC-Eval-STM32F107 23 * Evaluation Board 24 * 25 * Filename : app_cfg.h 26 * Version : V1.00 27 * Programmer(s) : FT 28 ********************************************************************************************************* 29 */ 30 31 #ifndef APP_CFG_MODULE_PRESENT 32 #define APP_CFG_MODULE_PRESENT 33 34 35 /* 36 ********************************************************************************************************* 37 * MODULE ENABLE / DISABLE 38 ********************************************************************************************************* 39 */ 40 41 #define APP_CFG_FS_EN DEF_DISABLED 42 #define APP_CFG_USB_DEV_EN DEF_DISABLED 43 #define APP_CFG_USB_OTG_EN DEF_DISABLED 44 #define APP_CFG_USB_HOST_EN DEF_DISABLED 45 46 47 /* 48 ********************************************************************************************************* 49 * TASKS NAMES 50 ********************************************************************************************************* 51 */ 52 53 54 55 /* 56 ********************************************************************************************************* 57 * TASK PRIORITIES 58 ********************************************************************************************************* 59 */ 60 61 #define APP_TASK_START_PRIO 2 62 63 /* 64 ********************************************************************************************************* 65 * TASK STACK SIZES 66 * Size of the task stacks (# of OS_STK entries) 67 ********************************************************************************************************* 68 */ 69 70 #define APP_TASK_START_STK_SIZE 512 71 72 /* 73 ********************************************************************************************************* 74 * uC/LIB CONFIGURATION 75 ********************************************************************************************************* 76 */ 77 78 #define LIB_MEM_CFG_OPTIMIZE_ASM_EN DEF_ENABLED 79 #define LIB_MEM_CFG_ARG_CHK_EXT_EN DEF_ENABLED 80 #define LIB_MEM_CFG_ALLOC_EN DEF_ENABLED 81 #define LIB_MEM_CFG_POOL_NBR 10 82 #define LIB_MEM_CFG_HEAP_SIZE (2 * 1024L) 83 84 /* 85 ********************************************************************************************************* 86 * BSP CONFIGURATION 87 ********************************************************************************************************* 88 */ 89 90 #define BSP_CFG_SER_COMM_SEL BSP_SER_COMM_UART_02 91 92 93 /* 94 ********************************************************************************************************* 95 * TRACE / DEBUG CONFIGURATION 96 ********************************************************************************************************* 97 */ 98 99 #define TRACE_LEVEL_OFF 0 100 #define TRACE_LEVEL_INFO 1 101 #define TRACE_LEVEL_DBG 2 102 103 #define APP_TRACE_LEVEL TRACE_LEVEL_DBG 104 #define APP_TRACE BSP_Ser_Printf 105 106 #include <cpu.h> 107 void BSP_Ser_Printf (CPU_CHAR *format, ...); 108 109 #define FS_TRACE_LEVEL TRACE_LEVEL_DBG 110 #define FS_TRACE BSP_Ser_Printf 111 112 #define APP_TRACE_INFO(x) ((APP_TRACE_LEVEL >= TRACE_LEVEL_INFO) ? (void)(APP_TRACE x) : (void)0) 113 #define APP_TRACE_DBG(x) ((APP_TRACE_LEVEL >= TRACE_LEVEL_DBG ) ? (void)(APP_TRACE x) : (void)0) 114 115 116 117 118 /* task priority */ 119 #define STARTUP_TASK_PRIO 4 120 //#define TASK_MODBUS_PRIO 5 121 //#define TASK_SI4432_PRIO 6 122 123 #define TASK1_PRIO 10 124 #define TASK2_PRIO 13 125 #define TASK3_PRIO 14 126 127 128 /* task stack size */ 129 #define STARTUP_TASK_STK_SIZE 100 130 #define TASK_MODBUS_SIZE 80 131 #define TASK1_STK_SIZE 80 132 #define TASK2_STK_SIZE 80 133 #define TASK3_STK_SIZE 80 134 //#define TASK_SI432_SIZE 80 135 136 137 138 139 #endif
下面对Project\App\uCOS_III\uC-CPU\Ports 下cpu_a.s进行修改, 因为这是GNU的汇编代码。
如下替换:
‘@’ 换为‘;’
.global 换为EXPORT
以下代码
.text
.align 2
.thumb
.syntax unified
换为
PRESERVE8
AREA |.text|, CODE, READONLY
THUMB
把函数名上的.thumb_func 在前后添加 ‘;’注释掉;
并把函数 名后紧跟的‘:’删除。
修改后如下:
;******************************************************************************************************** ; uC/CPU ; CPU CONFIGURATION & PORT LAYER ; ; (c) Copyright 2004-2011; Micrium, Inc.; Weston, FL ; ; All rights reserved. Protected by international copyright laws. ; ; uC/CPU is provided in source form to registered licensees ONLY. It is ; illegal to distribute this source code to any third party unless you receive ; written permission by an authorized Micrium representative. Knowledge of ; the source code may NOT be used to develop a similar product. ; ; Please help us continue to provide the Embedded community with the finest ; software available. Your honesty is greatly appreciated. ; ; You can contact us at www.micrium.com. ;******************************************************************************************************** ;******************************************************************************************************** ; ; CPU PORT FILE ; ; ARM-Cortex-M3 ; GNU C Compiler ; ; Filename : cpu_a.s ; Version : V1.29.00.00 ; Programmer(s) : JJL ;******************************************************************************************************** ;******************************************************************************************************** ; PUBLIC FUNCTIONS ;******************************************************************************************************** EXPORT CPU_IntDis EXPORT CPU_IntEn EXPORT CPU_SR_Save EXPORT CPU_SR_Restore EXPORT CPU_WaitForInt EXPORT CPU_WaitForExcept EXPORT CPU_CntLeadZeros EXPORT CPU_CntTrailZeros EXPORT CPU_RevBits ;******************************************************************************************************** ; CODE GENERATION DIRECTIVES ;******************************************************************************************************** PRESERVE8 AREA |.text|, CODE, READONLY THUMB ;$PAGE ;******************************************************************************************************** ; DISABLE and ENABLE INTERRUPTS ; ; Description : Disable/Enable interrupts. ; ; Prototypes : void CPU_IntDis(void); ; void CPU_IntEn (void); ;******************************************************************************************************** ;.thumb_func CPU_IntDis CPSID I BX LR ;.thumb_func CPU_IntEn CPSIE I BX LR ;******************************************************************************************************** ; CRITICAL SECTION FUNCTIONS ; ; Description : Disable/Enable interrupts by preserving the state of interrupts. Generally speaking, the ; state of the interrupt disable flag is stored in the local variable 'cpu_sr' & interrupts ; are then disabled ('cpu_sr' is allocated in all functions that need to disable interrupts). ; The previous interrupt state is restored by copying 'cpu_sr' into the CPU's status register. ; ; Prototypes : CPU_SR CPU_SR_Save (void); ; void CPU_SR_Restore(CPU_SR cpu_sr); ; ; Note(s) : (1) These functions are used in general like this : ; ; void Task (void *p_arg) ; { ; CPU_SR_ALLOC(); /* Allocate storage for CPU status register */ ; : ; : ; CPU_CRITICAL_ENTER(); /* cpu_sr = CPU_SR_Save(); */ ; : ; : ; CPU_CRITICAL_EXIT(); /* CPU_SR_Restore(cpu_sr); */ ; : ; } ;******************************************************************************************************** ;.thumb_func CPU_SR_Save MRS R0, PRIMASK ; Set prio int mask to mask all (except faults) CPSID I BX LR ;.thumb_func CPU_SR_Restore ; See Note #2. MSR PRIMASK, R0 BX LR ;$PAGE ;******************************************************************************************************** ; WAIT FOR INTERRUPT ; ; Description : Enters sleep state, which will be exited when an interrupt is received. ; ; Prototypes : void CPU_WaitForInt (void) ; ; Argument(s) : none. ;******************************************************************************************************** ;.thumb_func CPU_WaitForInt WFI ; Wait for interrupt BX LR ;******************************************************************************************************** ; WAIT FOR EXCEPTION ; ; Description : Enters sleep state, which will be exited when an exception is received. ; ; Prototypes : void CPU_WaitForExcept (void) ; ; Argument(s) : none. ;******************************************************************************************************** ;.thumb_func CPU_WaitForExcept WFE ; Wait for exception BX LR ;$PAGE ;******************************************************************************************************** ; CPU_CntLeadZeros() ; COUNT LEADING ZEROS ; ; Description : Counts the number of contiguous, most-significant, leading zero bits before the ; first binary one bit in a data value. ; ; Prototype : CPU_DATA CPU_CntLeadZeros(CPU_DATA val); ; ; Argument(s) : val Data value to count leading zero bits. ; ; Return(s) : Number of contiguous, most-significant, leading zero bits in 'val'. ; ; Caller(s) : Application. ; ; This function is an INTERNAL CPU module function but MAY be called by application ; function(s). ; ; Note(s) : (1) (a) Supports 32-bit data value size as configured by 'CPU_DATA' (see 'cpu.h ; CPU WORD CONFIGURATION Note #1'). ; ; (b) For 32-bit values : ; ; b31 b30 b29 ... b04 b03 b02 b01 b00 # Leading Zeros ; --- --- --- --- --- --- --- --- --------------- ; 1 x x x x x x x 0 ; 0 1 x x x x x x 1 ; 0 0 1 x x x x x 2 ; : : : : : : : : : ; : : : : : : : : : ; 0 0 0 1 x x x x 27 ; 0 0 0 0 1 x x x 28 ; 0 0 0 0 0 1 x x 29 ; 0 0 0 0 0 0 1 x 30 ; 0 0 0 0 0 0 0 1 31 ; 0 0 0 0 0 0 0 0 32 ; ; ; (2) MUST be defined in 'cpu_a.asm' (or 'cpu_c.c') if CPU_CFG_LEAD_ZEROS_ASM_PRESENT is ; #define'd in 'cpu_cfg.h' or 'cpu.h'. ;******************************************************************************************************** ;.thumb_func CPU_CntLeadZeros CLZ R0, R0 ; Count leading zeros BX LR ;$PAGE ;******************************************************************************************************** ; CPU_CntTrailZeros() ; COUNT TRAILING ZEROS ; ; Description : Counts the number of contiguous, least-significant, trailing zero bits before the ; first binary one bit in a data value. ; ; Prototype : CPU_DATA CPU_CntTrailZeros(CPU_DATA val); ; ; Argument(s) : val Data value to count trailing zero bits. ; ; Return(s) : Number of contiguous, least-significant, trailing zero bits in 'val'. ; ; Caller(s) : Application. ; ; This function is an INTERNAL CPU module function but MAY be called by application ; function(s). ; ; Note(s) : (1) (a) Supports 32-bit data value size as configured by 'CPU_DATA' (see 'cpu.h ; CPU WORD CONFIGURATION Note #1'). ; ; (b) For 32-bit values : ; ; b31 b30 b29 b28 b27 ... b02 b01 b00 # Trailing Zeros ; --- --- --- --- --- --- --- --- ---------------- ; x x x x x x x 1 0 ; x x x x x x 1 0 1 ; x x x x x 1 0 0 2 ; : : : : : : : : : ; : : : : : : : : : ; x x x x 1 0 0 0 27 ; x x x 1 0 0 0 0 28 ; x x 1 0 0 0 0 0 29 ; x 1 0 0 0 0 0 0 30 ; 1 0 0 0 0 0 0 0 31 ; 0 0 0 0 0 0 0 0 32 ; ; ; (2) MUST be defined in 'cpu_a.asm' (or 'cpu_c.c') if CPU_CFG_TRAIL_ZEROS_ASM_PRESENT is ; #define'd in 'cpu_cfg.h' or 'cpu.h'. ;******************************************************************************************************** ;.thumb_func CPU_CntTrailZeros RBIT R0, R0 ; Reverse bits CLZ R0, R0 ; Count leading zeros BX LR ;$PAGE ;******************************************************************************************************** ; CPU_RevBits() ; REVERSE BITS ; ; Description : Reverses the bits in a data value. ; ; Prototypes : CPU_DATA CPU_RevBits(CPU_DATA val); ; ; Argument(s) : val Data value to reverse bits. ; ; Return(s) : Value with all bits in 'val' reversed (see Note #1). ; ; Caller(s) : Application. ; ; This function is an INTERNAL CPU module function but MAY be called by application function(s). ; ; Note(s) : (1) The final, reversed data value for 'val' is such that : ; ; 'val's final bit 0 = 'val's original bit N ; 'val's final bit 1 = 'val's original bit (N - 1) ; 'val's final bit 2 = 'val's original bit (N - 2) ; ; ... ... ; ; 'val's final bit (N - 2) = 'val's original bit 2 ; 'val's final bit (N - 1) = 'val's original bit 1 ; 'val's final bit N = 'val's original bit 0 ;******************************************************************************************************** ;.thumb_func CPU_RevBits RBIT R0, R0 ; Reverse bits BX LR ;$PAGE ;******************************************************************************************************** ; CPU ASSEMBLY PORT FILE END ;******************************************************************************************************** END
修改os_cfg.h
OS_CFG_TS_EN宏定义改为0u
OS_CFG_SCHED_LOCK_TIME_MEAS_EN 宏定义改为0u
OS_CFG_TASK_DEL_EN 宏定义改为 1u
其它可根据自己的功能需要 先1u或ou。
这里Project\App\uCOS_III\uC-LIB\Source中lib_str.c的Str_FmtNbr_Int32 函数 的函数体内局部变量没有赋初值,不够严谨 这里赋初值如下:
CPU_CHAR *pstr_fmt = (CPU_CHAR *)0; CPU_DATA i = 0u; CPU_INT32U nbr_fmt = 0u; CPU_INT32U nbr_log = 0u; CPU_INT08U nbr_dig_max = 0u; CPU_INT08U nbr_dig_min = 0u; CPU_INT08U nbr_dig_fmtd = 0u; CPU_INT08U nbr_neg_sign = 0u; CPU_INT08U nbr_lead_char = 0u; CPU_INT08U dig_val = 0u; CPU_INT08U lead_char_delta_0 = 0u; CPU_INT08U lead_char_delta_a = 0u; CPU_BOOLEAN lead_char_dig = 0u; CPU_BOOLEAN lead_char_0 = 0u; CPU_BOOLEAN fmt_invalid = 0u; CPU_BOOLEAN print_char = 0u; CPU_BOOLEAN nbr_neg_fmtd = 0u;
最后修改启动文件startup_stm32f10x_hd.s ,加载不同的启动文件 时不用怕,修改的内容都是一样的:
OS_CPU_PendSVHandler 替换所有的PendSV_Handler
OS_CPU_SysTickHandler替换所有的SysTick_Handler
使中断执行uCos的中断函数。
到这里就全部OK了。
仿真查看端口变化
编程结果过于臃肿:
开启3级优化:
再编译看结果:
整个工程文件存到我的网盘中http://pan.baidu.com/share/link?shareid=25418&uk=118334538
希望以上资料对大家有所帮助。