单片机教程网

电脑版
提示:原网页已由神马搜索转码, 内容由www.51hei.com提供.
查看:2658|回复:0
打印上一主题下一主题

ucosII信号量学习资料及代码

[复制链接]
跳转到指定楼层
楼主
ID:773304发表于 2020-6-8 21:45|只看该作者|只看大图回帖奖励
附件中有某高校ucosII有关信号量的ppt及相关代码。

在uCOS_II.H中增加变量定义   1
在test.c中注释掉变量y   1
文件OS_SEM.C中的OSSemPend函数中添加红色部分代码   1
文件OS_SEM.C中的OSSemPost函数中添加红色部分代码   3

在uCOS_II.H中增加变量定义
/********************************************************************************************************
                               GLOBAL VARIABLES
**********************************************************************************************************/

OS_EXT  INT8U         y;   //定义打印输出位置变量
OS_EXT  INT32U         OSCtxSwCtr;           /* Counter of number of context switches         */

#if (OS_EVENT_EN > 0)&& (OS_MAX_EVENTS > 0)
OS_EXT  OS_EVENT       *OSEventFreeList;       /* Pointer to list of free EVENT control blocks   */
OS_EXT  OS_EVENT       OSEventTbl[OS_MAX_EVENTS];/* Table of EVENT control blocks             */
#endif

在test.c中注释掉变量y

文件OS_SEM.C中的OSSemPend函数中添加红色部分代码
void  OSSemPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)
{
#if OS_CRITICAL_METHOD == 3     /* Allocate storage for CPU status register     */
   OS_CPU_SR  cpu_sr;
#endif  
   char str[25];

   if (OSIntNesting > 0) {  /* See if called from ISR ...   */
       *err = OS_ERR_PEND_ISR;  /* ... can't PEND from an ISR       */
       return;
   }
#if OS_ARG_CHK_EN > 0
   if (pevent == (OS_EVENT *)0) {   /* Validate 'pevent'         */
       *err = OS_ERR_PEVENT_NULL;
       return;
   }
   if (pevent->OSEventType != OS_EVENT_TYPE_SEM) {   /* Validate event block type  */
       *err = OS_ERR_EVENT_TYPE;
       return;
   }
#endif
   OS_ENTER_CRITICAL();
   if (pevent->OSEventCnt > 0) { /* If sem. is positive, resource available ...   */
       pevent->OSEventCnt--;   /* ... decrement semaphore only if positive.     */
       OS_EXIT_CRITICAL();
       *err = OS_NO_ERR;

       sprintf(str, "task%d--resource count: %d", OSTCBCur->OSTCBPrio, pevent->OSEventCnt);
       PC_DispStr(15, y++, str, DISP_FGND_YELLOW+DISP_BGND_BLUE);

       return;
   }
   /* Otherwise, must wait until event occurs     */
   OSTCBCur->OSTCBStat |= OS_STAT_SEM;  /* Resource not available, pend on semaphore     */
   OSTCBCur->OSTCBDly   = timeout;  /* Store pend timeout in TCB     */
   OS_EventTaskWait(pevent);   /* Suspend task until event or timeout occurs   */
   OS_EXIT_CRITICAL();

   sprintf(str, "task%d--I'll wait", OSTCBCur->OSTCBPrio);
   PC_DispStr(15, y++, str, DISP_FGND_YELLOW+DISP_BGND_BLUE);

   OS_Sched();       /* Find next highest priority task ready       */
   OS_ENTER_CRITICAL();
   if (OSTCBCur->OSTCBStat& OS_STAT_SEM) { /* Must have timed out if still waiting for event*/
       OS_EventTO(pevent);
       OS_EXIT_CRITICAL();
       *err = OS_TIMEOUT;   /* Indicate that didn't get event within TO     */

       sprintf(str, "task%d--time out", OSTCBCur->OSTCBPrio);
       PC_DispStr(15, y++, str, DISP_FGND_YELLOW+DISP_BGND_BLUE);

       return;
   }
   OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;
   OS_EXIT_CRITICAL();
   sprintf(str, "task%d--finally get it", OSTCBCur->OSTCBPrio);
   PC_DispStr(15, y++, str, DISP_FGND_YELLOW+DISP_BGND_BLUE);
   *err = OS_NO_ERR;
}
文件OS_SEM.C中的OSSemPost函数中添加红色部分代码

INT8U  OSSemPost (OS_EVENT *pevent)
{
#if OS_CRITICAL_METHOD == 3     /* Allocate storage for CPU status register */
   OS_CPU_SR  cpu_sr;                    
#endif  
   char str[25];

#if OS_ARG_CHK_EN > 0
   if (pevent == (OS_EVENT *)0) {  /* Validate 'pevent'     */
       return (OS_ERR_PEVENT_NULL);
   }
   if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type   */
       return (OS_ERR_EVENT_TYPE);
   }
#endif
   OS_ENTER_CRITICAL();
   if (pevent->OSEventGrp != 0x00) { /* See if any task waiting for semaphore   */
       OS_EventTaskRdy(pevent, (void *)0, OS_STAT_SEM);   /* Ready highest prio task waiting on event */
       OS_EXIT_CRITICAL();

       sprintf(str, "task%d--I'll Sched", OSTCBCur->OSTCBPrio);
       PC_DispStr(15, y++, str, DISP_FGND_YELLOW+DISP_BGND_BLUE);

       OS_Sched();   /* Find highest priority task ready to run  */

       sprintf(str, "task%d--back from Sched", OSTCBCur->OSTCBPrio);
       PC_DispStr(15, y++, str, DISP_FGND_YELLOW+DISP_BGND_BLUE);

       return (OS_NO_ERR);
   }
   if (pevent->OSEventCnt< 65535) {   /* Make sure semaphore will not overflow   */
       pevent->OSEventCnt++;     /* Increment semaphore count to register event   */
       OS_EXIT_CRITICAL();

       sprintf(str, "task%d--resource count: %d", OSTCBCur->OSTCBPrio, pevent->OSEventCnt);
       PC_DispStr(15, y++, str, DISP_FGND_YELLOW+DISP_BGND_BLUE);

       return (OS_NO_ERR);
   }
   OS_EXIT_CRITICAL();     /* Semaphore value has reached its maximum     */

   sprintf(str, "task%d--OS_SEM_OVF", OSTCBCur->OSTCBPrio);
   PC_DispStr(15, y++, str, DISP_FGND_YELLOW+DISP_BGND_BLUE);

   return (OS_SEM_OVF);
}


07-任务的同步与通信.zip

300.99 KB, 下载次数: 22, 下载积分: 黑币 -5

评分

黑币 +50
收起理由
+ 50
共享资料的黑币奖励!

查看全部评分

手机版|小黑屋|51黑电子论坛|51黑电子论坛6群QQ管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网