单片机ucos3任务实验
·
单片机 :STM32F407
开发板:DMF407电机开发板
平台:keil V5.31
HSE 为8MHZ
HSI为16MHZ
一、任务创建与删除实验
主函数
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
sys_stm32_clock_init(336, 8, 2, 7); /* 设置时钟,168Mhz */
delay_init(168); /* 延时初始化 */
usart_init(115200); /* 串口初始化为115200 */
led_init(); /* 初始化LED */
lcd_init(); /* 初始化LCD */
key_init(); /* 初始化按键 */
my_mem_init(SRAMIN); /* 初始化内部SRAM内存池 */
my_mem_init(SRAMCCM); /* 初始化内部SRAMCCM内存池 */
uc_os3_demo(); /* 运行uC/OS-III例程 */
}
ucos3
void uc_os3_demo(void)
{
OS_ERR err;
lcd_show_string(10, 10, 220, 32, 32, "STM32", RED);
lcd_show_string(10, 47, 220, 24, 24, "Task Create & Del", RED);
lcd_show_string(10, 76, 220, 16, 16, "ATOM@ALIENTEK", RED);
lcd_draw_rectangle(5, 110, 115, 314, BLACK);
lcd_draw_rectangle(125, 110, 234, 314, BLACK);
lcd_draw_line(5, 130, 115, 130, BLACK);
lcd_draw_line(125, 130, 234, 130, BLACK);
lcd_show_string(15, 111, 110, 16, 16, "Task1: 000", BLUE);
lcd_show_string(135, 111, 110, 16, 16, "Task2: 000", BLUE);
/* 初始化uC/OS-III */
OSInit(&err);
/* 创建Start Task */
OSTaskCreate( (OS_TCB *)&StartTask_TCB,
(CPU_CHAR *)"start_task",
(OS_TASK_PTR )start_task,
(void *)0,
(OS_PRIO )START_TASK_PRIO,
(CPU_STK *)StartTask_STK,
(CPU_STK_SIZE )START_STK_SIZE / 10,
(CPU_STK_SIZE )START_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);
for (;;)
{
/* 不会进入这里 */
}
}
void start_task(void *p_arg)
{
OS_ERR err;
CPU_INT32U cnts;
/* 初始化CPU库 */
CPU_Init();
/* 根据配置的节拍频率配置SysTick */
cnts = (CPU_INT32U)(HAL_RCC_GetSysClockFreq() / OSCfg_TickRate_Hz);
OS_CPU_SysTickInit(cnts);
/* 开启时间片调度,时间片设为默认值 */
OSSchedRoundRobinCfg(OS_TRUE, 0, &err);
/* 创建Task1 */
Task1Task_STK = (CPU_STK *)mymalloc(SRAMIN, TASK1_STK_SIZE * sizeof(CPU_STK));
OSTaskCreate( (OS_TCB *)&Task1Task_TCB,
(CPU_CHAR *)"task1",
(OS_TASK_PTR )task1,
(void *)0,
(OS_PRIO )TASK1_PRIO,
(CPU_STK *)Task1Task_STK,
(CPU_STK_SIZE )TASK1_STK_SIZE / 10,
(CPU_STK_SIZE )TASK1_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);
/* 创建Task2 */
Task2Task_STK = (CPU_STK *)mymalloc(SRAMIN, TASK2_STK_SIZE * sizeof(CPU_STK));
OSTaskCreate( (OS_TCB *)&Task2Task_TCB,
(CPU_CHAR *)"task2",
(OS_TASK_PTR )task2,
(void *)0,
(OS_PRIO )TASK2_PRIO,
(CPU_STK *)Task2Task_STK,
(CPU_STK_SIZE )TASK2_STK_SIZE / 10,
(CPU_STK_SIZE )TASK2_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);
/* 创建Task3 */
Task3Task_STK = (CPU_STK *)mymalloc(SRAMIN, TASK3_STK_SIZE * sizeof(CPU_STK));
OSTaskCreate( (OS_TCB *)&Task3Task_TCB,
(CPU_CHAR *)"task3",
(OS_TASK_PTR )task3,
(void *)0,
(OS_PRIO )TASK3_PRIO,
(CPU_STK *)Task3Task_STK,
(CPU_STK_SIZE )TASK3_STK_SIZE / 10,
(CPU_STK_SIZE )TASK3_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);
/* 删除Start Task */
OSTaskDel((OS_TCB *)0, &err);
}
void task1(void *p_arg)
{
uint32_t task1_num = 0;
OS_ERR err;
while (1)
{
lcd_fill(6, 131, 114, 313, lcd_discolor[++task1_num % 11]);
lcd_show_xnum(71, 111, task1_num, 3, 16, 0x80, BLUE);
OSTimeDly(500, OS_OPT_TIME_DLY, &err);
}
}
void task2(void *p_arg)
{
uint32_t task2_num = 0;
OS_ERR err;
while (1)
{
lcd_fill(126, 131, 233, 313, lcd_discolor[11 - (++task2_num % 11)]);
lcd_show_xnum(191, 111, task2_num, 3, 16, 0x80, BLUE);
OSTimeDly(500, OS_OPT_TIME_DLY, &err);
}
}
void task3(void *p_arg)
{
uint8_t key = 0;
OS_ERR err;
while (1)
{
key = key_scan(0);
switch (key)
{
case KEY0_PRES: /* 删除任务1 */
{
OSTaskDel(&Task1Task_TCB, &err);
myfree(SRAMIN, Task1Task_STK);
break;
}
case KEY1_PRES: /* 删除任务2 */
{
OSTaskDel(&Task2Task_TCB, &err);
myfree(SRAMIN, Task2Task_STK);
break;
}
default:
{
break;
}
}
OSTimeDly(10, OS_OPT_TIME_DLY, &err);
}
}
测试结果:

二、任务挂起与恢复实验
主函数
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
sys_stm32_clock_init(336, 8, 2, 7); /* 设置时钟,168Mhz */
delay_init(168); /* 延时初始化 */
usart_init(115200); /* 串口初始化为115200 */
led_init(); /* 初始化LED */
lcd_init(); /* 初始化LCD */
key_init(); /* 初始化按键 */
my_mem_init(SRAMIN); /* 初始化内部SRAM内存池 */
my_mem_init(SRAMCCM); /* 初始化内部SRAMCCM内存池 */
uc_os3_demo(); /* 运行uC/OS-III例程 */
}
ucos3:
void uc_os3_demo(void)
{
OS_ERR err;
lcd_show_string(10, 10, 220, 32, 32, "STM32", RED);
lcd_show_string(10, 47, 220, 24, 24, "Task Susp & Resum", RED);
lcd_show_string(10, 76, 220, 16, 16, "ATOM@ALIENTEK", RED);
lcd_draw_rectangle(5, 110, 115, 314, BLACK);
lcd_draw_rectangle(125, 110, 234, 314, BLACK);
lcd_draw_line(5, 130, 115, 130, BLACK);
lcd_draw_line(125, 130, 234, 130, BLACK);
lcd_show_string(15, 111, 110, 16, 16, "Task1: 000", BLUE);
lcd_show_string(135, 111, 110, 16, 16, "Task2: 000", BLUE);
/* 初始化uC/OS-III */
OSInit(&err);
/* 创建Start Task */
OSTaskCreate( (OS_TCB *)&StartTask_TCB,
(CPU_CHAR *)"start_task",
(OS_TASK_PTR )start_task,
(void *)0,
(OS_PRIO )START_TASK_PRIO,
(CPU_STK *)StartTask_STK,
(CPU_STK_SIZE )START_STK_SIZE / 10,
(CPU_STK_SIZE )START_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);
for (;;)
{
/* 不会进入这里 */
}
}
task:
void start_task(void *p_arg)
{
OS_ERR err;
CPU_INT32U cnts;
/* 初始化CPU库 */
CPU_Init();
/* 根据配置的节拍频率配置SysTick */
cnts = (CPU_INT32U)(HAL_RCC_GetSysClockFreq() / OSCfg_TickRate_Hz);
OS_CPU_SysTickInit(cnts);
/* 开启时间片调度,时间片设为默认值 */
OSSchedRoundRobinCfg(OS_TRUE, 0, &err);
/* 创建Task1 */
Task1Task_STK = (CPU_STK *)mymalloc(SRAMIN, TASK1_STK_SIZE * sizeof(CPU_STK));
OSTaskCreate( (OS_TCB *)&Task1Task_TCB,
(CPU_CHAR *)"task1",
(OS_TASK_PTR )task1,
(void *)0,
(OS_PRIO )TASK1_PRIO,
(CPU_STK *)Task1Task_STK,
(CPU_STK_SIZE )TASK1_STK_SIZE / 10,
(CPU_STK_SIZE )TASK1_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);
/* 创建Task2 */
Task2Task_STK = (CPU_STK *)mymalloc(SRAMIN, TASK2_STK_SIZE * sizeof(CPU_STK));
OSTaskCreate( (OS_TCB *)&Task2Task_TCB,
(CPU_CHAR *)"task2",
(OS_TASK_PTR )task2,
(void *)0,
(OS_PRIO )TASK2_PRIO,
(CPU_STK *)Task2Task_STK,
(CPU_STK_SIZE )TASK2_STK_SIZE / 10,
(CPU_STK_SIZE )TASK2_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);
/* 创建Task3 */
Task3Task_STK = (CPU_STK *)mymalloc(SRAMIN, TASK3_STK_SIZE * sizeof(CPU_STK));
OSTaskCreate( (OS_TCB *)&Task3Task_TCB,
(CPU_CHAR *)"task3",
(OS_TASK_PTR )task3,
(void *)0,
(OS_PRIO )TASK3_PRIO,
(CPU_STK *)Task3Task_STK,
(CPU_STK_SIZE )TASK3_STK_SIZE / 10,
(CPU_STK_SIZE )TASK3_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);
/* 删除Start Task */
OSTaskDel((OS_TCB *)0, &err);
}
void task1(void *p_arg)
{
uint32_t task1_num = 0;
OS_ERR err;
while (1)
{
lcd_fill(6, 131, 114, 313, lcd_discolor[++task1_num % 11]);
lcd_show_xnum(71, 111, task1_num, 3, 16, 0x80, BLUE);
OSTimeDly(500, OS_OPT_TIME_DLY, &err);
}
}
void task2(void *p_arg)
{
uint32_t task2_num = 0;
OS_ERR err;
while (1)
{
lcd_fill(126, 131, 233, 313, lcd_discolor[11 - (++task2_num % 11)]);
lcd_show_xnum(191, 111, task2_num, 3, 16, 0x80, BLUE);
OSTimeDly(500, OS_OPT_TIME_DLY, &err);
}
}
void task3(void *p_arg)
{
uint8_t key = 0;
OS_ERR err;
while (1)
{
key = key_scan(0);
switch (key)
{
case KEY0_PRES: /* 挂起任务1 */
{
OSTaskSuspend(&Task1Task_TCB, &err);
break;
}
case KEY1_PRES: /* 恢复任务1 */
{
OSTaskResume(&Task1Task_TCB, &err);
break;
}
default:
{
break;
}
}
OSTimeDly(10, OS_OPT_TIME_DLY, &err);
}
}
实验结果:

三、任务优先级修改实验
主函数
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
sys_stm32_clock_init(336, 8, 2, 7); /* 设置时钟,168Mhz */
delay_init(168); /* 延时初始化 */
usart_init(115200); /* 串口初始化为115200 */
led_init(); /* 初始化LED */
lcd_init(); /* 初始化LCD */
key_init(); /* 初始化按键 */
my_mem_init(SRAMIN); /* 初始化内部SRAM内存池 */
my_mem_init(SRAMCCM); /* 初始化内部SRAMCCM内存池 */
uc_os3_demo(); /* 运行uC/OS-III例程 */
}
ucos3:
void uc_os3_demo(void)
{
OS_ERR err;
lcd_show_string(10, 10, 220, 32, 32, "STM32", RED);
lcd_show_string(10, 47, 220, 24, 24, "Task Prio Change", RED);
lcd_show_string(10, 76, 220, 16, 16, "ATOM@ALIENTEK", RED);
/* 初始化uC/OS-III */
OSInit(&err);
/* 创建Start Task */
OSTaskCreate( (OS_TCB *)&StartTask_TCB,
(CPU_CHAR *)"start_task",
(OS_TASK_PTR )start_task,
(void *)0,
(OS_PRIO )START_TASK_PRIO,
(CPU_STK *)StartTask_STK,
(CPU_STK_SIZE )START_STK_SIZE / 10,
(CPU_STK_SIZE )START_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);
for (;;)
{
/* 不会进入这里 */
}
}
task:
void start_task(void *p_arg)
{
OS_ERR err;
CPU_INT32U cnts;
/* 初始化CPU库 */
CPU_Init();
/* 根据配置的节拍频率配置SysTick */
cnts = (CPU_INT32U)(HAL_RCC_GetSysClockFreq() / OSCfg_TickRate_Hz);
OS_CPU_SysTickInit(cnts);
/* 开启时间片调度,时间片设为默认值 */
OSSchedRoundRobinCfg(OS_TRUE, 0, &err);
/* 创建Task1 */
Task1Task_STK = (CPU_STK *)mymalloc(SRAMIN, TASK1_STK_SIZE * sizeof(CPU_STK));
OSTaskCreate( (OS_TCB *)&Task1Task_TCB,
(CPU_CHAR *)"task1",
(OS_TASK_PTR )task1,
(void *)0,
(OS_PRIO )TASK1_PRIO,
(CPU_STK *)Task1Task_STK,
(CPU_STK_SIZE )TASK1_STK_SIZE / 10,
(CPU_STK_SIZE )TASK1_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);
/* 创建Task2 */
Task2Task_STK = (CPU_STK *)mymalloc(SRAMIN, TASK2_STK_SIZE * sizeof(CPU_STK));
OSTaskCreate( (OS_TCB *)&Task2Task_TCB,
(CPU_CHAR *)"task2",
(OS_TASK_PTR )task2,
(void *)0,
(OS_PRIO )TASK2_PRIO,
(CPU_STK *)Task2Task_STK,
(CPU_STK_SIZE )TASK2_STK_SIZE / 10,
(CPU_STK_SIZE )TASK2_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);
/* 创建Task3 */
Task3Task_STK = (CPU_STK *)mymalloc(SRAMIN, TASK3_STK_SIZE * sizeof(CPU_STK));
OSTaskCreate( (OS_TCB *)&Task3Task_TCB,
(CPU_CHAR *)"task3",
(OS_TASK_PTR )task3,
(void *)0,
(OS_PRIO )TASK3_PRIO,
(CPU_STK *)Task3Task_STK,
(CPU_STK_SIZE )TASK3_STK_SIZE / 10,
(CPU_STK_SIZE )TASK3_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);
/* 删除Start Task */
OSTaskDel((OS_TCB *)0, &err);
}
void task1(void *p_arg)
{
uint32_t task1_num = 0;
CPU_SR_ALLOC();
while (1)
{
CPU_CRITICAL_ENTER();
printf("Task1 run %d times\r\n", ++task1_num);
CPU_CRITICAL_EXIT();
delay_ms(500);
}
}
void task2(void *p_arg)
{
uint32_t task2_num = 0;
CPU_SR_ALLOC();
while (1)
{
CPU_CRITICAL_ENTER();
printf("Task2 run %d times\r\n", ++task2_num);
CPU_CRITICAL_EXIT();
delay_ms(500);
}
}
void task3(void *p_arg)
{
uint8_t key;
OS_ERR err;
while (1)
{
key = key_scan(0);
switch (key)
{
case KEY0_PRES:
{
OSTaskChangePrio( (OS_TCB *)&Task1Task_TCB,
(OS_PRIO )OS_CFG_PRIO_MAX - 5,
(OS_ERR *)&err);
OSTaskChangePrio( (OS_TCB *)&Task2Task_TCB,
(OS_PRIO )OS_CFG_PRIO_MAX - 4,
(OS_ERR *)&err);
break;
}
case KEY1_PRES:
{
OSTaskChangePrio( (OS_TCB *)&Task1Task_TCB,
(OS_PRIO )OS_CFG_PRIO_MAX - 4,
(OS_ERR *)&err);
OSTaskChangePrio( (OS_TCB *)&Task2Task_TCB,
(OS_PRIO )OS_CFG_PRIO_MAX - 5,
(OS_ERR *)&err);
break;
}
default:
{
break;
}
}
OSTimeDly(10, OS_OPT_TIME_DLY, &err);
}
}
测试结果:


四、时间片调度实验
主函数
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
sys_stm32_clock_init(336, 8, 2, 7); /* 设置时钟,168Mhz */
delay_init(168); /* 延时初始化 */
usart_init(115200); /* 串口初始化为115200 */
led_init(); /* 初始化LED */
lcd_init(); /* 初始化LCD */
key_init(); /* 初始化按键 */
my_mem_init(SRAMIN); /* 初始化内部SRAM内存池 */
my_mem_init(SRAMCCM); /* 初始化内部SRAMCCM内存池 */
uc_os3_demo(); /* 运行uC/OS-III例程 */
}
ucos3:
void uc_os3_demo(void)
{
OS_ERR err;
lcd_show_string(10, 10, 220, 32, 32, "STM32", RED);
lcd_show_string(10, 47, 220, 24, 24, "Round Robin", RED);
lcd_show_string(10, 76, 220, 16, 16, "ATOM@ALIENTEK", RED);
/* 初始化uC/OS-III */
OSInit(&err);
/* 创建Start Task */
OSTaskCreate( (OS_TCB *)&StartTask_TCB,
(CPU_CHAR *)"start_task",
(OS_TASK_PTR )start_task,
(void *)0,
(OS_PRIO )START_TASK_PRIO,
(CPU_STK *)StartTask_STK,
(CPU_STK_SIZE )START_STK_SIZE / 10,
(CPU_STK_SIZE )START_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);
for (;;)
{
/* 不会进入这里 */
}
}
task:
void start_task(void *p_arg)
{
OS_ERR err;
CPU_INT32U cnts;
/* 初始化CPU库 */
CPU_Init();
/* 根据配置的节拍频率配置SysTick */
cnts = (CPU_INT32U)(HAL_RCC_GetSysClockFreq() / OSCfg_TickRate_Hz);
OS_CPU_SysTickInit(cnts);
/* 开启时间片调度,时间片设为默认值 */
OSSchedRoundRobinCfg(OS_TRUE, 1, &err);
/* 创建Task1 */
Task1Task_STK = (CPU_STK *)mymalloc(SRAMIN, TASK1_STK_SIZE * sizeof(CPU_STK));
OSTaskCreate( (OS_TCB *)&Task1Task_TCB,
(CPU_CHAR *)"task1",
(OS_TASK_PTR )task1,
(void *)0,
(OS_PRIO )TASK1_PRIO,
(CPU_STK *)Task1Task_STK,
(CPU_STK_SIZE )TASK1_STK_SIZE / 10,
(CPU_STK_SIZE )TASK1_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);
/* 创建Task2 */
Task2Task_STK = (CPU_STK *)mymalloc(SRAMIN, TASK2_STK_SIZE * sizeof(CPU_STK));
OSTaskCreate( (OS_TCB *)&Task2Task_TCB,
(CPU_CHAR *)"task2",
(OS_TASK_PTR )task2,
(void *)0,
(OS_PRIO )TASK2_PRIO,
(CPU_STK *)Task2Task_STK,
(CPU_STK_SIZE )TASK2_STK_SIZE / 10,
(CPU_STK_SIZE )TASK2_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);
/* 删除Start Task */
OSTaskDel((OS_TCB *)0, &err);
}
void task1(void *p_arg)
{
uint32_t task1_num = 0;
CPU_SR_ALLOC();
while (1)
{
CPU_CRITICAL_ENTER();
printf("任务1运行次数: %d\r\n", ++task1_num);
CPU_CRITICAL_EXIT();
}
}
void task2(void *p_arg)
{
uint32_t task2_num = 0;
CPU_SR_ALLOC();
while (1)
{
CPU_CRITICAL_ENTER();
printf("任务2运行次数: %d\r\n", ++task2_num);
CPU_CRITICAL_EXIT();
}
}
实验结果:

五、空闲任务钩子函数实验
主函数
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
sys_stm32_clock_init(336, 8, 2, 7); /* 设置时钟,168Mhz */
delay_init(168); /* 延时初始化 */
usart_init(115200); /* 串口初始化为115200 */
led_init(); /* 初始化LED */
lcd_init(); /* 初始化LCD */
key_init(); /* 初始化按键 */
my_mem_init(SRAMIN); /* 初始化内部SRAM内存池 */
my_mem_init(SRAMCCM); /* 初始化内部SRAMCCM内存池 */
uc_os3_demo(); /* 运行uC/OS-III例程 */
}
ucso3:
void uc_os3_demo(void)
{
OS_ERR err;
lcd_show_string(10, 10, 220, 32, 32, "STM32", RED);
lcd_show_string(10, 47, 220, 24, 24, "IDLE Task Hook", RED);
lcd_show_string(10, 76, 220, 16, 16, "ATOM@ALIENTEK", RED);
/* 初始化uC/OS-III */
OSInit(&err);
/* 创建Start Task */
OSTaskCreate( (OS_TCB *)&StartTask_TCB,
(CPU_CHAR *)"start_task",
(OS_TASK_PTR )start_task,
(void *)0,
(OS_PRIO )START_TASK_PRIO,
(CPU_STK *)StartTask_STK,
(CPU_STK_SIZE )START_STK_SIZE / 10,
(CPU_STK_SIZE )START_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);
for (;;)
{
/* 不会进入这里 */
}
}
task:
void start_task(void *p_arg)
{
OS_ERR err;
CPU_INT32U cnts;
/* 初始化CPU库 */
CPU_Init();
/* 根据配置的节拍频率配置SysTick */
cnts = (CPU_INT32U)(HAL_RCC_GetSysClockFreq() / OSCfg_TickRate_Hz);
OS_CPU_SysTickInit(cnts);
/* 开启时间片调度,时间片设为默认值 */
OSSchedRoundRobinCfg(OS_TRUE, 0, &err);
/* 设置钩子函数 */
App_OS_SetAllHooks();
/* 创建Task1 */
Task1Task_STK = (CPU_STK *)mymalloc(SRAMIN, TASK1_STK_SIZE * sizeof(CPU_STK));
OSTaskCreate( (OS_TCB *)&Task1Task_TCB,
(CPU_CHAR *)"task1",
(OS_TASK_PTR )task1,
(void *)0,
(OS_PRIO )TASK1_PRIO,
(CPU_STK *)Task1Task_STK,
(CPU_STK_SIZE )TASK1_STK_SIZE / 10,
(CPU_STK_SIZE )TASK1_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);
/* 创建Task2 */
Task2Task_STK = (CPU_STK *)mymalloc(SRAMIN, TASK2_STK_SIZE * sizeof(CPU_STK));
OSTaskCreate( (OS_TCB *)&Task2Task_TCB,
(CPU_CHAR *)"task2",
(OS_TASK_PTR )task2,
(void *)0,
(OS_PRIO )TASK2_PRIO,
(CPU_STK *)Task2Task_STK,
(CPU_STK_SIZE )TASK2_STK_SIZE / 10,
(CPU_STK_SIZE )TASK2_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);
/* 删除Start Task */
OSTaskDel((OS_TCB *)0, &err);
}
void task1(void *p_arg)
{
uint32_t task1_num = 0;
OS_ERR err;
while(1)
{
lcd_clear(lcd_discolor[++task1_num % 14]); /* 刷新屏幕 */
lcd_show_string(10, 10, 220, 32, 32, "STM32", RED);
lcd_show_string(10, 47, 220, 24, 24, "IDLE Task Hook", RED);
lcd_show_string(10, 76, 220, 16, 16, "ATOM@ALIENTEK", RED);
LED0_TOGGLE(); /* LED0闪烁 */
OSTimeDly(1000, OS_OPT_TIME_DLY, &err); /* 延时1000ticks */
}
}
void task2(void *p_arg)
{
float float_num = 0.0;
OS_ERR err;
while(1)
{
float_num += 0.01f; /* 更新数值 */
printf("float_num: %0.4f\r\n", float_num); /* 打印数值 */
OSTimeDly(1000, OS_OPT_TIME_DLY, &err); /* 延时1000ticks */
}
}
钩子函数
void App_OS_IdleTaskHook (void)
{
static unsigned int idle_num = 0;
CPU_SR_ALLOC();
CPU_CRITICAL_ENTER();
if (++idle_num%1000000 == 0)
{
printf("Idle task runing!\r\n");
}
CPU_CRITICAL_EXIT();
}
测试结果:

六、ucos3统计功能实验
主函数
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
sys_stm32_clock_init(336, 8, 2, 7); /* 设置时钟,168Mhz */
delay_init(168); /* 延时初始化 */
usart_init(115200); /* 串口初始化为115200 */
led_init(); /* 初始化LED */
lcd_init(); /* 初始化LCD */
key_init(); /* 初始化按键 */
my_mem_init(SRAMIN); /* 初始化内部SRAM内存池 */
my_mem_init(SRAMCCM); /* 初始化内部SRAMCCM内存池 */
uc_os3_demo(); /* 运行uC/OS-III例程 */
}
ucos3:
void uc_os3_demo(void)
{
OS_ERR err;
lcd_show_string(10, 10, 220, 32, 32, "STM32", RED);
lcd_show_string(10, 47, 220, 24, 24, "CPU Usage", RED);
lcd_show_string(10, 76, 220, 16, 16, "ATOM@ALIENTEK", RED);
lcd_draw_rectangle(5, 110, 234, 310, BLACK);
lcd_show_string(13, 112, 200, 16, 16, "Item CPU Usage/Max", BLUE);
lcd_draw_line(5, 130, 234, 130, BLACK);
lcd_show_string(13, 132, 216, 16, 16, "CPU . %/ . %", BLUE);
lcd_draw_line(5, 150, 234, 150, BLACK);
lcd_show_string(13, 152, 216, 16, 16, "Idle Task . %/ . %", BLUE);
lcd_draw_line(5, 170, 234, 170, BLACK);
lcd_show_string(13, 172, 216, 16, 16, "Stat Task . %/ . %", BLUE);
lcd_draw_line(5, 190, 234, 190, BLACK);
lcd_show_string(13, 192, 216, 16, 16, "Timer Task . %/ . %", BLUE);
lcd_draw_line(5, 210, 234, 210, BLACK);
lcd_show_string(13, 212, 216, 16, 16, "task1 . %/ . %", BLUE);
lcd_draw_line(5, 230, 234, 230, BLACK);
lcd_show_string(13, 232, 216, 16, 16, "task2 . %/ . %", BLUE);
lcd_draw_line(5, 250, 234, 250, BLACK);
lcd_show_string(13, 252, 216, 16, 16, "Item Stk Usage/Total", BLUE);
lcd_draw_line(5, 270, 234, 270, BLACK);
lcd_show_string(13, 272, 216, 16, 16, "task1 W/ W", BLUE);
lcd_draw_line(5, 290, 234, 290, BLACK);
lcd_show_string(13, 292, 216, 16, 16, "task2 W/ W", BLUE);
lcd_draw_line(101, 110, 101, 310, BLACK);
/* 初始化uC/OS-III */
OSInit(&err);
/* 创建Start Task */
OSTaskCreate( (OS_TCB *)&StartTask_TCB,
(CPU_CHAR *)"start_task",
(OS_TASK_PTR )start_task,
(void *)0,
(OS_PRIO )START_TASK_PRIO,
(CPU_STK *)StartTask_STK,
(CPU_STK_SIZE )START_STK_SIZE / 10,
(CPU_STK_SIZE )START_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);
for (;;)
{
/* 不会进入这里 */
}
}
task:
void start_task(void *p_arg)
{
OS_ERR err;
CPU_INT32U cnts;
/* 初始化CPU库 */
CPU_Init();
/* 根据配置的节拍频率配置SysTick */
cnts = (CPU_INT32U)(HAL_RCC_GetSysClockFreq() / OSCfg_TickRate_Hz);
OS_CPU_SysTickInit(cnts);
/* 开启时间片调度,时间片设为默认值 */
OSSchedRoundRobinCfg(OS_TRUE, 0, &err);
/* 初始化CPU利用率统计 */
OSStatTaskCPUUsageInit(&err);
/* 创建Task1 */
Task1Task_STK = (CPU_STK *)mymalloc(SRAMIN, TASK1_STK_SIZE * sizeof(CPU_STK));
OSTaskCreate( (OS_TCB *)&Task1Task_TCB,
(CPU_CHAR *)"task1",
(OS_TASK_PTR )task1,
(void *)0,
(OS_PRIO )TASK1_PRIO,
(CPU_STK *)Task1Task_STK,
(CPU_STK_SIZE )TASK1_STK_SIZE / 10,
(CPU_STK_SIZE )TASK1_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);
/* 创建Task2 */
Task2Task_STK = (CPU_STK *)mymalloc(SRAMIN, TASK2_STK_SIZE * sizeof(CPU_STK));
OSTaskCreate( (OS_TCB *)&Task2Task_TCB,
(CPU_CHAR *)"task2",
(OS_TASK_PTR )task2,
(void *)0,
(OS_PRIO )TASK2_PRIO,
(CPU_STK *)Task2Task_STK,
(CPU_STK_SIZE )TASK2_STK_SIZE / 10,
(CPU_STK_SIZE )TASK2_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);
/* 删除Start Task */
OSTaskDel((OS_TCB *)0, &err);
}
void task1(void *p_arg)
{
uint8_t key;
OS_ERR err;
while (1)
{
key = key_scan(0);
switch (key)
{
case KEY0_PRES:
{
LED0_TOGGLE();
break;
}
case KEY1_PRES:
{
LED1_TOGGLE();
break;
}
default:
{
break;
}
}
OSTimeDly(10, OS_OPT_TIME_DLY, &err);
}
}
void task2(void *p_arg)
{
OS_ERR err;
while (1)
{
lcd_show_num(109, 132, OSStatTaskCPUUsage / 100, 3, 16, BLUE);
lcd_show_xnum(141, 132, OSStatTaskCPUUsage % 100, 2, 16, 0x80, BLUE);
lcd_show_num(173, 132, OSStatTaskCPUUsageMax / 100, 3, 16, BLUE);
lcd_show_xnum(205, 132, OSStatTaskCPUUsageMax % 100, 2, 16, 0x80, BLUE);
lcd_show_num(109, 152, OSIdleTaskTCB.CPUUsage / 100, 3, 16, BLUE);
lcd_show_xnum(141, 152, OSIdleTaskTCB.CPUUsage % 100, 2, 16, 0x80, BLUE);
lcd_show_num(173, 152, OSIdleTaskTCB.CPUUsageMax / 100, 3, 16, BLUE);
lcd_show_xnum(205, 152, OSIdleTaskTCB.CPUUsageMax % 100, 2, 16, 0x80, BLUE);
lcd_show_num(109, 172, OSStatTaskTCB.CPUUsage / 100, 3, 16, BLUE);
lcd_show_xnum(141, 172, OSStatTaskTCB.CPUUsage % 100, 2, 16, 0x80, BLUE);
lcd_show_num(173, 172, OSStatTaskTCB.CPUUsageMax / 100, 3, 16, BLUE);
lcd_show_xnum(205, 172, OSStatTaskTCB.CPUUsageMax % 100, 2, 16, 0x80, BLUE);
lcd_show_num(109, 192, OSTmrTaskTCB.CPUUsage / 100, 3, 16, BLUE);
lcd_show_xnum(141, 192, OSTmrTaskTCB.CPUUsage % 100, 2, 16, 0x80, BLUE);
lcd_show_num(173, 192, OSTmrTaskTCB.CPUUsageMax / 100, 3, 16, BLUE);
lcd_show_xnum(205, 192, OSTmrTaskTCB.CPUUsageMax % 100, 2, 16, 0x80, BLUE);
lcd_show_num(109, 212, Task1Task_TCB.CPUUsage / 100, 3, 16, BLUE);
lcd_show_xnum(141, 212, Task1Task_TCB.CPUUsage % 100, 2, 16, 0x80, BLUE);
lcd_show_num(173, 212, Task1Task_TCB.CPUUsageMax / 100, 3, 16, BLUE);
lcd_show_xnum(205, 212, Task1Task_TCB.CPUUsageMax % 100, 2, 16, 0x80, BLUE);
lcd_show_num(109, 232, Task2Task_TCB.CPUUsage / 100, 3, 16, BLUE);
lcd_show_xnum(141, 232, Task2Task_TCB.CPUUsage % 100, 2, 16, 0x80, BLUE);
lcd_show_num(173, 232, Task2Task_TCB.CPUUsageMax / 100, 3, 16, BLUE);
lcd_show_xnum(205, 232, Task2Task_TCB.CPUUsageMax % 100, 2, 16, 0x80, BLUE);
lcd_show_num(109, 272, Task1Task_TCB.StkUsed, 4, 16, BLUE);
lcd_show_num(157, 272, TASK1_STK_SIZE, 4, 16, BLUE);
lcd_show_num(109, 292, Task2Task_TCB.StkUsed, 4, 16, BLUE);
lcd_show_num(157, 292, TASK2_STK_SIZE, 4, 16, BLUE);
OSTimeDly(50, OS_OPT_TIME_DLY, &err);
}
}
测试结果:

七、共享资源冲突访问实验
主函数
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
sys_stm32_clock_init(336, 8, 2, 7); /* 设置时钟,168Mhz */
delay_init(168); /* 延时初始化 */
usart_init(115200); /* 串口初始化为115200 */
led_init(); /* 初始化LED */
lcd_init(); /* 初始化LCD */
key_init(); /* 初始化按键 */
my_mem_init(SRAMIN); /* 初始化内部SRAM内存池 */
my_mem_init(SRAMCCM); /* 初始化内部SRAMCCM内存池 */
uc_os3_demo(); /* 运行uC/OS-III例程 */
}
ucos3:
void uc_os3_demo(void)
{
OS_ERR err;
lcd_show_string(10, 10, 220, 32, 32, "STM32", RED);
lcd_show_string(10, 47, 220, 24, 24, "Access Violations", RED);
lcd_show_string(10, 76, 220, 16, 16, "ATOM@ALIENTEK", RED);
/* 初始化uC/OS-III */
OSInit(&err);
/* 创建Start Task */
OSTaskCreate( (OS_TCB *)&StartTask_TCB,
(CPU_CHAR *)"start_task",
(OS_TASK_PTR )start_task,
(void *)0,
(OS_PRIO )START_TASK_PRIO,
(CPU_STK *)StartTask_STK,
(CPU_STK_SIZE )START_STK_SIZE / 10,
(CPU_STK_SIZE )START_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);
for (;;)
{
/* 不会进入这里 */
}
}
task:
void start_task(void *p_arg)
{
OS_ERR err;
CPU_INT32U cnts;
/* 初始化CPU库 */
CPU_Init();
/* 根据配置的节拍频率配置SysTick */
cnts = (CPU_INT32U)(HAL_RCC_GetSysClockFreq() / OSCfg_TickRate_Hz);
OS_CPU_SysTickInit(cnts);
/* 开启时间片调度,时间片设为默认值 */
OSSchedRoundRobinCfg(OS_TRUE, 1, &err);
/* 创建Task1 */
Task1Task_STK = (CPU_STK *)mymalloc(SRAMIN, TASK1_STK_SIZE * sizeof(CPU_STK));
OSTaskCreate( (OS_TCB *)&Task1Task_TCB,
(CPU_CHAR *)"task1",
(OS_TASK_PTR )task1,
(void *)0,
(OS_PRIO )TASK1_PRIO,
(CPU_STK *)Task1Task_STK,
(CPU_STK_SIZE )TASK1_STK_SIZE / 10,
(CPU_STK_SIZE )TASK1_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);
/* 创建Task2 */
Task2Task_STK = (CPU_STK *)mymalloc(SRAMIN, TASK2_STK_SIZE * sizeof(CPU_STK));
OSTaskCreate( (OS_TCB *)&Task2Task_TCB,
(CPU_CHAR *)"task2",
(OS_TASK_PTR )task2,
(void *)0,
(OS_PRIO )TASK2_PRIO,
(CPU_STK *)Task2Task_STK,
(CPU_STK_SIZE )TASK2_STK_SIZE / 10,
(CPU_STK_SIZE )TASK2_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);
/* 删除Start Task */
OSTaskDel((OS_TCB *)0, &err);
}
void task1(void *p_arg)
{
while (1)
{
printf("This is task1!\r\n");
}
}
void task2(void *p_arg)
{
while (1)
{
printf("This is task2!\r\n");
}
}
测试结果:

更多推荐
所有评论(0)