本帖最后由 fjjjnk1234 于 2015-2-12 15:54 编辑
最近移植了一下UCOS-III,准确来说,是从安富莱的例程中修改过来的,目前测试了单任务创建和多任务的调度。其它信号量,邮箱······暂时没测试。安富莱的例程中固件库用的是1.3版本的,1.3版本的固件库system_stm32f4xx.c文件中,没有针对STM32F411的时钟配置,所以,主要修改文件中针对STM32F40_41xxx的时钟配置,修改的地方如下: 252行: /************************* PLL Parameters *************************************/
/* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */
#define PLL_M 16 //modify by fjjjnk1234 default:25
/* USB OTG FS, SDIO and RNG Clock = PLL_VCO / PLLQ */
#define PLL_Q 7
#if defined (STM32F40_41xxx)
#define PLL_N 400 //modify by fjjjnk1234 default:336
/* SYSCLK = PLL_VCO / PLL_P */
#define PLL_P 4 //modify by fjjjnk1234 default:2
#endif /* STM32F40_41xxx */
290行开始: /** @addtogroup STM32F4xx_System_Private_Variables
* @{
*/
#if defined (STM32F40_41xxx)
uint32_t SystemCoreClock = 100000000; //modify by fjjjnk1234 default:168000000
#endif /* STM32F40_41xxx */
505行: #if defined (STM32F40_41xxx) || defined (STM32F427_437xx) || defined (STM32F429_439xx)
/* PCLK2 = HCLK / 2*/
RCC->CFGR |= RCC_CFGR_PPRE2_DIV1; //modify by fjjjnk1234 default:...DIV2
/* PCLK1 = HCLK / 4*/
RCC->CFGR |= RCC_CFGR_PPRE1_DIV2; //modify by fjjjnk1234 default:...DIV4
#endif /* STM32F40_41xxx || STM32F427_437x || STM32F429_439xx */
521行: /* Configure the main PLL */
RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) |
(RCC_PLLCFGR_PLLSRC_HSI) | (PLL_Q << 24); //modify by fjjjnk1234 default:RCC_PLLCFGR_PLLSRC_HSE
单任务创建测试程序: #include <includes.h>
/*
*********************************************************************************************************
* LOCAL GLOBAL VARIABLES
*********************************************************************************************************
*/
static OS_TCB LED_TCB; //定义任务控制块
static CPU_STK LED_Stk[128]; //定义任务堆栈
/*
*********************************************************************************************************
* FUNCTION PROTOTYPES
*********************************************************************************************************
*/
static void Task_LED(void *p_arg);
/*
*********************************************************************************************************
* 函 数 名: main
* 功能说明: 标准c程序入口。
* 形 参:无
* 返 回 值: 无
*********************************************************************************************************
*/
int main(void)
{
OS_ERR err;
// BSP_IntDisAll(); /* Disable all interrupts. */
bsp_Init();
CPU_Init();
BSP_Tick_Init();
OSInit(&err); /* Init uC/OS-III. */
/*创建任务*/
OSTaskCreate((OS_TCB *)&LED_TCB, // 任务控制块指针
(CPU_CHAR *)"LED", // 任务名称
(OS_TASK_PTR )Task_LED, // 任务代码指针
(void *)0, // 传递给任务的参数parg
(OS_PRIO )2, // 任务优先级
(CPU_STK *)&LED_Stk[0], // 任务堆栈基地址
(CPU_STK_SIZE)12, // 堆栈剩余警戒线
(CPU_STK_SIZE)128, // 堆栈大小
(OS_MSG_QTY )0, // 可接收的最大消息队列数
(OS_TICK )0, // 时间片轮转时间
(void *)0, // 任务控制块扩展信息
(OS_OPT )(OS_OPT_TASK_STK_CHK |
OS_OPT_TASK_STK_CLR), // 任务选项
(OS_ERR *)&err); // 返回值
OSStart(&err); /* Start multitasking (i.e. give control to uC/OS-III). */
(void)&err;
return (0);
}
void Task_LED(void *p_arg)
{
OS_ERR err;
(void)p_arg; // 'p_arg' 并没有用到,防止编译器提示警告
while (1)
{
GPIO_SetBits(GPIOA, GPIO_Pin_5);
OSTimeDlyHMSM(0, 0,0,500,OS_OPT_TIME_HMSM_STRICT,&err);
GPIO_ResetBits(GPIOA, GPIO_Pin_5);
GPIO_SetBits(GPIOA, GPIO_Pin_6);
OSTimeDlyHMSM(0, 0,0,500,OS_OPT_TIME_HMSM_STRICT,&err);
GPIO_ResetBits(GPIOA, GPIO_Pin_6);
GPIO_SetBits(GPIOA, GPIO_Pin_7);
OSTimeDlyHMSM(0, 0,0,500,OS_OPT_TIME_HMSM_STRICT,&err);
GPIO_ResetBits(GPIOA, GPIO_Pin_7);
}
}
实验现象: PA5、PA6、PA7引出的LED流水灯闪烁 完整程序:(单任务创建)
多任务:#include <includes.h>
/*******************设置任务优先级*******************/
#define STARTUP_TASK_PRIO 3
#define TASK_LED1_PRIO 4
#define TASK_LED2_PRIO 5
#define TASK_LED3_PRIO 6
/************设置栈大小(单位为 OS_STK )************/
#define STARTUP_TASK_STK_SIZE 80
#define TASK_LED1_STK_SIZE 80
#define TASK_LED2_STK_SIZE 80
#define TASK_LED3_STK_SIZE 80
/*
*********************************************************************************************************
* LOCAL GLOBAL VARIABLES
*********************************************************************************************************
*/
static OS_TCB StartUp_TCB;
static CPU_STK StartUp_Stk[STARTUP_TASK_STK_SIZE];
static OS_TCB LED1_TCB;
static CPU_STK LED1_Stk[TASK_LED1_STK_SIZE];
static OS_TCB LED2_TCB;
static CPU_STK LED2_Stk[TASK_LED2_STK_SIZE];
static OS_TCB LED3_TCB;
static CPU_STK LED3_Stk[TASK_LED3_STK_SIZE];
/*
*********************************************************************************************************
* FUNCTION PROTOTYPES
*********************************************************************************************************
*/
void Task_Start(void *p_arg);
void Task_LED1(void *p_arg);
void Task_LED2(void *p_arg);
void Task_LED3(void *p_arg);
/*
*********************************************************************************************************
* 函 数 名: main
* 功能说明: 标准c程序入口。
* 形 参:无
* 返 回 值: 无
*********************************************************************************************************
*/
int main(void)
{
OS_ERR err;
// BSP_IntDisAll(); /* Disable all interrupts. */
bsp_Init();
CPU_Init();
BSP_Tick_Init();
OSInit(&err); /* Init uC/OS-III. */
/*创建任务*/
OSTaskCreate((OS_TCB *)&StartUp_TCB, // 任务控制块指针
(CPU_CHAR *)"StartUp", // 任务名称
(OS_TASK_PTR )Task_Start, // 任务代码指针
(void *)0, // 传递给任务的参数parg
(OS_PRIO )STARTUP_TASK_PRIO, // 任务优先级
(CPU_STK *)&StartUp_Stk[0], // 任务堆栈基地址
(CPU_STK_SIZE)STARTUP_TASK_STK_SIZE/10, // 堆栈剩余警戒线
(CPU_STK_SIZE)STARTUP_TASK_STK_SIZE, // 堆栈大小
(OS_MSG_QTY )0, // 可接收的最大消息队列数
(OS_TICK )0, // 时间片轮转时间
(void *)0, // 任务控制块扩展信息
(OS_OPT )(OS_OPT_TASK_STK_CHK |
OS_OPT_TASK_STK_CLR), // 任务选项
(OS_ERR *)&err); // 返回值
OSStart(&err); /* Start multitasking (i.e. give control to uC/OS-III). */
(void)&err;
return (0);
}
/*
* 函数名:Task_Start
* 描述 : 启动任务,
* 优先级为3,
* 创建LED1、LED2和LED3的任务
* 输入 :无
* 输出 : 无
*/
void Task_Start(void *p_arg)
{
OS_ERR err;
(void)p_arg;
//创建任务LED1
OSTaskCreate((OS_TCB *)&LED1_TCB, // 任务控制块指针
(CPU_CHAR *)"LED1", // 任务名称
(OS_TASK_PTR )Task_LED1, // 任务代码指针
(void *)0, // 传递给任务的参数parg
(OS_PRIO )TASK_LED1_PRIO, // 任务优先级
(CPU_STK *)&LED1_Stk[0], // 任务堆栈基地址
(CPU_STK_SIZE)TASK_LED1_STK_SIZE/10, // 堆栈剩余警戒线
(CPU_STK_SIZE)TASK_LED1_STK_SIZE, // 堆栈大小
(OS_MSG_QTY )0, // 可接收的最大消息队列数
(OS_TICK )0, // 时间片轮转时间
(void *)0, // 任务控制块扩展信息
(OS_OPT )(OS_OPT_TASK_STK_CHK |
OS_OPT_TASK_STK_CLR), // 任务选项
(OS_ERR *)&err); // 返回值
//创建任务LED2
OSTaskCreate((OS_TCB *)&LED2_TCB,
(CPU_CHAR *)"LED2",
(OS_TASK_PTR )Task_LED2,
(void *)0,
(OS_PRIO )TASK_LED2_PRIO,
(CPU_STK *)&LED2_Stk[0],
(CPU_STK_SIZE)TASK_LED2_STK_SIZE/10,
(CPU_STK_SIZE)TASK_LED2_STK_SIZE,
(OS_MSG_QTY )0,
(OS_TICK )0,
(void *)0,
(OS_OPT )(OS_OPT_TASK_STK_CHK |
OS_OPT_TASK_STK_CLR),
(OS_ERR *)&err);
//创建任务LED3
OSTaskCreate((OS_TCB *)&LED3_TCB,
(CPU_CHAR *)"LED3",
(OS_TASK_PTR )Task_LED3,
(void *)0,
(OS_PRIO )TASK_LED3_PRIO,
(CPU_STK *)&LED3_Stk[0],
(CPU_STK_SIZE)TASK_LED3_STK_SIZE/10,
(CPU_STK_SIZE)TASK_LED3_STK_SIZE,
(OS_MSG_QTY )0,
(OS_TICK )0,
(void *)0,
(OS_OPT )(OS_OPT_TASK_STK_CHK |
OS_OPT_TASK_STK_CLR),
(OS_ERR *)&err);
//任务删除自己
OSTaskDel(&StartUp_TCB,&err);
}
/*
* 函数名:Task_LED1
* 描述 : LED任务1,
* 优先级为4,
* 以100ms的间隔点亮、关闭LED1
* 输入 :无
* 输出 : 无
*/
void Task_LED1(void *p_arg)
{
OS_ERR err;
(void)p_arg;
while (1)
{
GPIO_SetBits(GPIOA, GPIO_Pin_5);
OSTimeDlyHMSM(0, 0,0,100,OS_OPT_TIME_HMSM_STRICT,&err); //延时阻塞100ms
GPIO_ResetBits(GPIOA, GPIO_Pin_5);
OSTimeDlyHMSM(0, 0,0,100,OS_OPT_TIME_HMSM_STRICT,&err);
}
}
/*
* 函数名:Task_LED2
* 描述 : LED任务2,
* 优先级为5,
* 以200ms的间隔点亮、关闭LED2
* 输入 :无
* 输出 : 无
*/
void Task_LED2(void *p_arg)
{
OS_ERR err;
(void)p_arg;
while (1)
{
GPIO_SetBits(GPIOA, GPIO_Pin_6);
OSTimeDlyHMSM(0, 0,0,200,OS_OPT_TIME_HMSM_STRICT,&err); //延时阻塞200ms
GPIO_ResetBits(GPIOA, GPIO_Pin_6);
OSTimeDlyHMSM(0, 0,0,200,OS_OPT_TIME_HMSM_STRICT,&err);
}
}
/*
* 函数名:Task_LED3
* 描述 : LED任务3,
* 优先级为6,
* 以300ms的间隔点亮、关闭LED3
* 输入 :无
* 输出 : 无
*/
void Task_LED3(void *p_arg)
{
OS_ERR err;
(void)p_arg;
while (1)
{
GPIO_SetBits(GPIOA, GPIO_Pin_7);
OSTimeDlyHMSM(0, 0,0,300,OS_OPT_TIME_HMSM_STRICT,&err); //延时阻塞300ms
GPIO_ResetBits(GPIOA, GPIO_Pin_7);
OSTimeDlyHMSM(0, 0,0,300,OS_OPT_TIME_HMSM_STRICT,&err);
}
}
实验现象:
PA5接的LED1以100ms的间隔点亮、关闭LED1
PA6接的LED2以200ms的间隔点亮、关闭LED2
PA7接的LED3以300ms的间隔点亮、关闭LED3
完整程序:(多任务)
uCos-III Template(多任务).rar
(1.34 MB)
|
|