单片机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, "uC/OS-III Bin Sem", 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);
/* 创建二值信号量 */
OSSemCreate((OS_SEM *)&binary_sem,
(CPU_CHAR *)"binary sem",
(OS_SEM_CTR )1,
(OS_ERR *)&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)
{
OS_ERR err;
while (1)
{
/* 获取二值信号量 */
OSSemPend( (OS_SEM *)&binary_sem,
(OS_TICK )0,
(OS_OPT )OS_OPT_PEND_BLOCKING,
(CPU_TS *)0,
(OS_ERR *)&err);
/* 访问共享资源 */
printf("This is task1!\r\n");
/* 释放二值信号量 */
OSSemPost( (OS_SEM *)&binary_sem,
(OS_OPT )OS_OPT_POST_1,
(OS_ERR *)&err);
}
}
void task2(void *p_arg)
{
OS_ERR err;
while (1)
{
/* 获取二值信号量 */
OSSemPend( (OS_SEM *)&binary_sem,
(OS_TICK )0,
(OS_OPT )OS_OPT_PEND_BLOCKING,
(CPU_TS *)0,
(OS_ERR *)&err);
/* 访问共享资源 */
printf("This is task2!\r\n");
/* 释放二值信号量 */
OSSemPost( (OS_SEM *)&binary_sem,
(OS_OPT )OS_OPT_POST_1,
(OS_ERR *)&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, "Count Semaphore", RED);
lcd_show_string(10, 76, 220, 16, 16, "ATOM@ALIENTEK", RED);
lcd_show_string(44, 111, 200, 16, 16, "Semaphore Value: 0", BLUE);
lcd_draw_rectangle(5, 110, 234, 314, BLACK);
lcd_draw_line(5, 130, 234, 130, 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);
/* 创建计数型信号量 */
OSSemCreate((OS_SEM *)&count_sem,
(CPU_CHAR *)"count_sem",
(OS_SEM_CTR )0,
(OS_ERR *)&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:
{
/* 释放计数型信号量 */
OSSemPost((OS_SEM *)&count_sem, (OS_OPT)OS_OPT_POST_ALL, &err);
lcd_show_xnum(180, 111, count_sem.Ctr, 2, 16, 0, BLUE);
break;
}
default:
{
break;
}
}
OSTimeDly(10, OS_OPT_TIME_DLY, &err);
}
}
void task2(void *p_arg)
{
uint32_t task2_num;
OS_ERR err;
while (1)
{
/* 获取计数型信号量 */
OSSemPend( (OS_SEM *)&count_sem,
(OS_TICK )0,
(OS_OPT )OS_OPT_PEND_BLOCKING,
(CPU_TS *)0,
(OS_ERR *)&err);
lcd_show_xnum(180, 111, count_sem.Ctr, 2, 16, 0, BLUE);
lcd_fill(6, 131, 233, 313, lcd_discolor[++task2_num % 11]);
OSTimeDly(1000, 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, "Priority Overturn", 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);
/* 创建信号量 */
OSSemCreate((OS_SEM *)&sem,
(CPU_CHAR *)"sem",
(OS_SEM_CTR )1,
(OS_ERR *)&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)
{
OS_ERR err;
OSTimeDly(500, OS_OPT_TIME_DLY, &err);
while (1)
{
printf("task1 ready to pend semaphore\r\n");
OSSemPend( (OS_SEM *)&sem,
(OS_TICK )0,
(OS_OPT )OS_OPT_PEND_BLOCKING,
(CPU_TS *)0,
(OS_ERR *)&err);
printf("task1 has pended semaphore\r\n");
printf("task1 runing\r\n");
printf("task1 post semaphore\r\n");
OSSemPost( (OS_SEM *)&sem,
(OS_OPT )OS_OPT_POST_ALL,
(OS_ERR *)&err);
OSTimeDly(100, OS_OPT_TIME_DLY, &err);
}
}
void task2(void *p_arg)
{
uint32_t task2_num = 0;
OS_ERR err;
OSTimeDly(200, OS_OPT_TIME_DLY, &err);
while (1)
{
for (task2_num=0; task2_num<5; task2_num++)
{
printf("task2 runing\r\n");
delay_ms(100);
}
OSTimeDly(1000, OS_OPT_TIME_DLY, &err);
}
}
void task3(void *p_arg)
{
uint32_t task3_num = 0;
OS_ERR err;
while (1)
{
printf("task3 ready to pend semaphore\r\n");
OSSemPend( (OS_SEM *)&sem,
(OS_TICK )0,
(OS_OPT )OS_OPT_PEND_BLOCKING,
(CPU_TS *)0,
(OS_ERR *)&err);
printf("task3 has pend semaphore\r\n");
for (task3_num=0; task3_num<5; task3_num++)
{
printf("task3 runing\r\n");
delay_ms(100);
}
printf("task3 post semaphore\r\n");
OSSemPost( (OS_SEM *)&sem,
(OS_OPT )OS_OPT_POST_ALL,
(OS_ERR *)&err);
OSTimeDly(1000, 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, "uC/OS-III Mutex", 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);
/* 创建互斥信号量 */
OSMutexCreate( (OS_MUTEX *)&mutex,
(CPU_CHAR *)"mutex",
(OS_ERR *)&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)
{
OS_ERR err;
while (1)
{
/* 获取互斥信号量 */
OSMutexPend( (OS_MUTEX *)&mutex,
(OS_TICK )0,
(OS_OPT )OS_OPT_PEND_BLOCKING,
(CPU_TS *)0,
(OS_ERR *)&err);
/* 访问共享资源 */
printf("This is task1!\r\n");
/* 释放互斥信号量 */
OSMutexPost( (OS_MUTEX *)&mutex,
(OS_OPT )OS_OPT_POST_NONE,
(OS_ERR *)&err);
}
}
void task2(void *p_arg)
{
OS_ERR err;
while (1)
{
/* 获取互斥信号量 */
OSMutexPend( (OS_MUTEX *)&mutex,
(OS_TICK )0,
(OS_OPT )OS_OPT_PEND_BLOCKING,
(CPU_TS *)0,
(OS_ERR *)&err);
/* 访问共享资源 */
printf("This is task2!\r\n");
/* 释放互斥信号量 */
OSMutexPost( (OS_MUTEX *)&mutex,
(OS_OPT )OS_OPT_POST_NONE,
(OS_ERR *)&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, "Mutex Pri Overturn", 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);
/* 创建互斥信号量 */
OSMutexCreate( (OS_MUTEX *)&mutex,
(CPU_CHAR *)"mutex",
(OS_ERR *)&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)
{
OS_ERR err;
OSTimeDly(500, OS_OPT_TIME_DLY, &err);
while (1)
{
printf("task1 ready to pend mutex\r\n");
OSMutexPend((OS_MUTEX *)&mutex,
(OS_TICK )0,
(OS_OPT )OS_OPT_PEND_BLOCKING,
(CPU_TS *)0,
(OS_ERR *)&err);
printf("task1 has pended mutex\r\n");
printf("task1 runing\r\n");
printf("task1 post mutex\r\n");
OSMutexPost((OS_MUTEX *)&mutex,
(OS_OPT )OS_OPT_POST_NONE,
(OS_ERR *)&err);
OSTimeDly(100, OS_OPT_TIME_DLY, &err);
}
}
void task2(void *p_arg)
{
uint32_t task2_num = 0;
OS_ERR err;
OSTimeDly(200, OS_OPT_TIME_DLY, &err);
while (1)
{
for (task2_num=0; task2_num<5; task2_num++)
{
printf("task2 runing\r\n");
delay_ms(100);
}
OSTimeDly(1000, OS_OPT_TIME_DLY, &err);
}
}
void task3(void *p_arg)
{
uint32_t task3_num = 0;
OS_ERR err;
while (1)
{
printf("task3 ready to pend mutex\r\n");
OSMutexPend((OS_MUTEX *)&mutex,
(OS_TICK )0,
(OS_OPT )OS_OPT_PEND_BLOCKING,
(CPU_TS *)0,
(OS_ERR *)&err);
printf("task3 has pend mutex\r\n");
for (task3_num=0; task3_num<5; task3_num++)
{
printf("task3 runing\r\n");
delay_ms(100);
}
printf("task3 post mutex\r\n");
OSMutexPost((OS_MUTEX *)&mutex,
(OS_OPT )OS_OPT_POST_NONE,
(OS_ERR *)&err);
OSTimeDly(1000, 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, "Message Queues", RED);
lcd_show_string(10, 76, 220, 16, 16, "ATOM@ALIENTEK", RED);
lcd_draw_rectangle(5, 130, 234, 314, 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);
/* 创建消息队列 */
OSQCreate( (OS_Q *)&q,
(CPU_CHAR *)"q",
(OS_MSG_QTY )1,
(OS_ERR *)&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);
if (key != 0)
{
OSQPost((OS_Q *)&q,
(void *)&key,
(OS_MSG_SIZE)sizeof(key),
(OS_OPT )OS_OPT_POST_FIFO,
(OS_ERR *)&err);
}
OSTimeDly(10, OS_OPT_TIME_DLY, &err);
}
}
void task2(void *p_arg)
{
uint32_t task2_num = 0;
uint8_t *key;
OS_MSG_SIZE size;
OS_ERR err;
while (1)
{
key = (uint8_t *)OSQPend((OS_Q *)&q, (OS_TICK)0, (OS_OPT)OS_OPT_PEND_BLOCKING, (OS_MSG_SIZE *)&size, (CPU_TS *)0, (OS_ERR *)&err);
switch (*key)
{
case KEY0_PRES:
{
lcd_fill(6, 131, 233, 313, lcd_discolor[++task2_num % 11]);
break;
}
case KEY1_PRES:
{
LED0_TOGGLE();
break;
}
default:
{
break;
}
}
}
}
测试结果:

更多推荐

所有评论(0)