实验(二)
*
*******************************************************************************************/
// 创建1个任务,任务执行完毕后自动退出
#if(0)
//任务优先级
#define TASK1_TASK_PRIO 6
//任务堆栈大小
#define TASK1_STK_SIZE 128
//任务控制块
OS_TCB Task1_TaskTCB;
//任务堆栈
CPU_STK TASK1_TASK_STK[TASK1_STK_SIZE];
void task1_task(void *p_arg);
//任务优先级
#define TASK2_TASK_PRIO 5
//任务堆栈大小
#define TASK2_STK_SIZE 128
//任务控制块
OS_TCB Task2_TaskTCB;
//任务堆栈
CPU_STK TASK2_TASK_STK[TASK2_STK_SIZE];
void task2_task(void *p_arg);
//任务优先级
#define TASK3_TASK_PRIO 4
//任务堆栈大小
#define TASK3_STK_SIZE 128
//任务控制块
OS_TCB Task3_TaskTCB;
//任务堆栈
CPU_STK TASK3_TASK_STK[TASK3_STK_SIZE];
void task3_task(void *p_arg);
// 信号量定义
OS_SEM SharedResourceSem; // 共享资源信号量
OS_SEM SyncSem; // 同步信号量
//开始任务任务函数
void start_task(void *p_arg)
{
CPU_INT32U cpu_clk_freq;
CPU_INT32U cnts;
OS_ERR err;
(void)p_arg;
BSP_Init(); /* Initialize BSP functions */ CPU_Init(); cpu_clk_freq = BSP_CPU_ClkFreq(); /* Determine SysTick reference freq. */ cnts = cpu_clk_freq / (CPU_INT32U)OSCfg_TickRate_Hz; /* Determine nbr SysTick increments */ OS_CPU_SysTickInit(cnts); /* Init uC/OS periodic time src (SysTick). */
// Mem_Init(); /* Initialize Memory Management Module */
#if OS_CFG_STAT_TASK_EN > 0u
OSStatTaskCPUUsageInit(&err); /* Compute CPU capacity with no task running */
#endif
CPU_IntDisMeasMaxCurReset();
#if OS_CFG_SCHED_ROUND_ROBIN_EN //当使用时间片轮转的时候
//使能时间片轮转调度功能,时间片长度为1个系统时钟节拍,既1*5=5ms
OSSchedRoundRobinCfg(DEF_ENABLED,1,&err);
#endif
//创建TASK1任务 OSTaskCreate((OS_TCB * )&Task1_TaskTCB, (CPU_CHAR * )"Task1 task", (OS_TASK_PTR )task1_task, (void * )0, (OS_PRIO )TASK1_TASK_PRIO, (CPU_STK * )&TASK1_TASK_STK[0], (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任务
OSTaskCreate((OS_TCB * )&Task2_TaskTCB,
(CPU_CHAR * )“Task2 task”,
(OS_TASK_PTR )task2_task,
(void * )0,
(OS_PRIO )TASK2_TASK_PRIO,
(CPU_STK * )&TASK2_TASK_STK[0],
(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任务
OSTaskCreate((OS_TCB * )&Task3_TaskTCB,
(CPU_CHAR * )“Task3 task”,
(OS_TASK_PTR )task3_task,
(void * )0,
(OS_PRIO )TASK3_TASK_PRIO,
(CPU_STK * )&TASK3_TASK_STK[0],
(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_task(void *p_arg) {
OS_ERR err;
while(1) {
// 获取共享资源信号量(第一次信号量接收)
OSSemPend(&SharedResourceSem, 0, OS_OPT_PEND_BLOCKING, 0, &err);
// 模拟处理共享资源(长时间操作) OSTimeDlyHMSM(0, 0, 2, 0, OS_OPT_TIME_DLY, &err); // 延时2秒 // 发送同步信号量(第一次信号量发送) OSSemPost(&SyncSem, OS_OPT_POST_1, &err); // 释放共享资源信号量 OSSemPost(&SharedResourceSem, OS_OPT_POST_1, &err); OSTimeDlyHMSM(0, 0, 5, 0, OS_OPT_TIME_DLY, &err); // 延时5秒 }
}
// 中优先级任务函数
void task2_task(void *p_arg) {
OS_ERR err;
while(1) {
// 执行不需要共享资源的操作
// 这个任务会抢占低优先级任务
OSTimeDlyHMSM(0, 0, 1, 0, OS_OPT_TIME_DLY, &err); // 延时1秒
}
}
// 高优先级任务函数
void task3_task(void *p_arg) {
OS_ERR err;
while(1) {
// 等待同步信号量(第二次信号量接收)
OSSemPend(&SyncSem, 0, OS_OPT_PEND_BLOCKING, 0, &err);
// 获取共享资源信号量(第二次信号量接收) OSSemPend(&SharedResourceSem, 0, OS_OPT_PEND_BLOCKING, 0, &err); // 执行关键操作 // 这里应该快速完成... // 发送同步信号量(第二次信号量发送) OSSemPost(&SyncSem, OS_OPT_POST_1, &err); // 释放共享资源信号量 OSSemPost(&SharedResourceSem, OS_OPT_POST_1, &err); OSTimeDlyHMSM(0, 0, 5, 0, OS_OPT_TIME_DLY, &err); // 延时5秒 }
}
#endif 帮我说明一下实验闪灯情况,并帮我写一份实验报告
最新发布