/**********************************
** 红龙429开发板
** 实验名:-红龙429-uCOS信号量
** KEIL MDK-ARM Standard Version:V5.10
** 软件库(keil) Version: unused
** 固件库(ST) Version: 1.5.0
实验现象: 创建信号量之后,就已经存在一个信号量,所以在任务二中,有连续释放两个
信号量,这时候任务 2 延时被挂起,任务一开始执行,获得三次信号量成功.随后
再次获得信号量的时候,因为已经没有信号量了,所以任务 1 被挂起等待信号量,
这时候,任务 2 延时结束,任务 2 开始运行,再次释放两个信号量,然后延时挂起,
任务 1 开始运行,前两次获得信号量成功,最后一次获得信号量失败,因为任务 2
只是释放了两个信号量.这里可以看到 OSSemAccept()函数在请求不到信号量的
时候,是不会挂起任务等待信号量的,而是直接返回的.只有OSSemPend()
函数才会在请求不到信号量的时候,把任务挂起,一直到获得信号量,或者超时返回.
/**
* @file main.c
* @author WB R&D Team - openmcu666
* @version V0.1
* @date 2016.2.29
* @brief Main Program body
*/
#include "UserTask.h"
extern OS_STK startup_task_stk[];//启动任务栈
void Delay(uint32_t Time)
{
uint32_t i;
i = 0;
while (Time--)
{
for (i = 0; i < 5000; i++);
}
}
/*****************************************************************************
** Main Function main()
******************************************************************************/
int main(void)
{
USART1_Init();
printf("\r\n");
printf("Hello Welcome.\r\n");
printf("Thank You For Choosing Our Products.\r\n");
printf("Thank You Very Much.\r\n");
printf("This Example is uCOS-II Semaphore.\r\n");
printf("\r\n");
printf("GPIO Initialization...\r\n");
LED_Init();
SysTick_Init();
printf("Ok,Let's Go...\r\n");
OSInit();
OSTaskCreate(Task_Start, //指向任务代码的指针
(void *)0, //任务开始执行时,传递给任务的参数parg
&startup_task_stk[STARTUP_TASK_STK_SIZE-1],//分配给任务的堆栈的栈顶指针
STARTUP_TASK_PRIO); //分配给任务的优先级
OSStart();
return 0;
}
嘿嘿 本帖最后由 没前途 于 2018-7-15 16:27 编辑