[mw_shl_code=c,true]/*

*********************************************************************************************************

*

*

* 火牛开发板uCOSII + STM32V3.4固件函数库+USART1驱动(实例二)

* MAIN 文件

* 创 建 人:LJ128

* 修改时间:2010年12月11日

*

*

*********************************************************************************************************

*/

#include "includes.h"

static OS_STK App_TaskStartStk[APP_TASK_START_STK_SIZE]; // TaskStart 任务堆栈

static void App_TaskStart(void* p_arg); // 声明 TaskStart 函数

static OS_STK App_TaskPrintfStk[APP_TASK_PRINTF_STK_SIZE]; // TaskPrintf 任务堆栈

static void App_TaskPrintf(void* p_arg); // 声明 TaskPrintf 函数

void LED1234_ON_OFF(CPU_INT08U Num); // 声明流水灯函数

OS_EVENT *Mutex_USART1;// 定义互斥型事件

/*

*********************************************************************************************************

main()

*********************************************************************************************************

*/

int main(void)

{

OSInit();

SysClock_Init(); /* 初始化系统外设、 CPU 时钟,仅此而已 */

/* 建立系统的第一个任务 */

OSTaskCreateExt(App_TaskStart, (void *) 0, (OS_STK *) &App_TaskStartStk[APP_TASK_START_STK_SIZE - 1], APP_TASK_START_PRIO,

APP_TASK_START_PRIO, (OS_STK *) &App_TaskStartStk[0], APP_TASK_START_STK_SIZE , (void *) 0, OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR

);

OSStart(); /* 开始任务调度 */

return (0);

}

/*

*********************************************************************************************************

系统的第一个任务,负责开OS时钟,建立其他任务

*********************************************************************************************************

*/

static void App_TaskStart(void* p_arg)

{

INT8U err;

INT8U i;

p_arg = p_arg;

/* 初始化 OS 时钟 */

OS_CPU_SysTickInit();

/* 统计任务 */

#if (OS_TASK_STAT_EN > 0)

OSStatInit();

#endif

Mutex_USART1 = OSMutexCreate(USART1_MUTEX_PRIO, &err); // 建立USART1互斥型信号量

// 建立打印任务

OSTaskCreateExt(App_TaskPrintf, (void *) 0, (OS_STK *) &App_TaskPrintfStk[APP_TASK_PRINTF_STK_SIZE - 1], APP_TASK_PRINTF_PRIO,

APP_TASK_PRINTF_PRIO, (OS_STK *) &App_TaskPrintfStk[0], APP_TASK_PRINTF_STK_SIZE , (void *) 0, OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR

);

/* 初始化外设 */

BSP_Init();

while (1) {

for(i = 0 ; i < 4; i++){

LED1234_ON_OFF(i);

OSTimeDlyHMSM(0,0,1,0);// 延时一秒

OSMutexPend(Mutex_USART1, 0, &err); // 等待信号量

USART1_Printf("******任务一输出********\r\n");

OSMutexPost(Mutex_USART1); // 释放信号量

}

}

}

/*

*********************************************************************************************************

打印线程,将串口1接收到的数据打印出来

*********************************************************************************************************

*/

static void App_TaskPrintf(void* p_arg)

{

INT8U err;

INT8U temp;

p_arg = p_arg;

while (1) {

OSTaskSuspend(OS_PRIO_SELF);// 先将任务挂起,在串口接收中断中恢复任务

OSMutexPend(Mutex_USART1, 0, &err); // 等待信号量

while(USART1_GetByte(&temp)){// 如果串口接收到数据打印出来

USART1_SendByte(temp);

}

OSMutexPost(Mutex_USART1); // 释放信号量

}

}

/*

*********************************************************************************************************

*********************************************************************************************************

* uC/OS-II APP HOOKS

*********************************************************************************************************

*********************************************************************************************************

*/

#if (OS_APP_HOOKS_EN > 0)

/*

*********************************************************************************************************

* TASK CREATION HOOK (APPLICATION)

*

* Description : This function is called when a task is created.

*

* Argument : ptcb is a pointer to the task control block of the task being created.

*

* Note : (1) Interrupts are disabled during this call.

*********************************************************************************************************

*/

void App_TaskCreateHook(OS_TCB* ptcb)

{

}

/*

*********************************************************************************************************

* TASK DELETION HOOK (APPLICATION)

*

* Description : This function is called when a task is deleted.

*

* Argument : ptcb is a pointer to the task control block of the task being deleted.

*

* Note : (1) Interrupts are disabled during this call.

*********************************************************************************************************

*/

void App_TaskDelHook(OS_TCB* ptcb)

{

(void) ptcb;

}

/*

*********************************************************************************************************

* IDLE TASK HOOK (APPLICATION)

*

* Description : This function is called by OSTaskIdleHook(), which is called by the idle task. This hook

* has been added to allow you to do such things as STOP the CPU to conserve power.

*

* Argument : none.

*

* Note : (1) Interrupts are enabled during this call.

*********************************************************************************************************

*/

#if OS_VERSION >= 251

void App_TaskIdleHook(void)

{

}

#endif

/*

*********************************************************************************************************

* STATISTIC TASK HOOK (APPLICATION)

*

* Description : This function is called by OSTaskStatHook(), which is called every second by uC/OS-II's

* statistics task. This allows your application to add functionality to the statistics task.

*

* Argument : none.

*********************************************************************************************************

*/

void App_TaskStatHook(void)

{

}

/*

*********************************************************************************************************

* TASK SWITCH HOOK (APPLICATION)

*

* Description : This function is called when a task switch is performed. This allows you to perform other

* operations during a context switch.

*

* Argument : none.

*

* Note : 1 Interrupts are disabled during this call.

*

* 2 It is assumed that the global pointer 'OSTCBHighRdy' points to the TCB of the task that

* will be 'switched in' (i.e. the highest priority task) and, 'OSTCBCur' points to the

* task being switched out (i.e. the preempted task).

*********************************************************************************************************

*/

#if OS_TASK_SW_HOOK_EN > 0

void App_TaskSwHook(void)

{

}

#endif

/*

*********************************************************************************************************

* OS_TCBInit() HOOK (APPLICATION)

*

* Description : This function is called by OSTCBInitHook(), which is called by OS_TCBInit() after setting

* up most of the TCB.

*

* Argument : ptcb is a pointer to the TCB of the task being created.

*

* Note : (1) Interrupts may or may not be ENABLED during this call.

*********************************************************************************************************

*/

#if OS_VERSION >= 204

void App_TCBInitHook(OS_TCB* ptcb)

{

(void) ptcb;

}

#endif

#endif

/******************************************

*

* LED 流水灯

*

****************************************/

void LED1234_ON_OFF(CPU_INT08U Num)

{

switch (Num) {

case 0:

GPIO_SetBits(GPIOD, GPIO_Pin_8);

GPIO_ResetBits(GPIOD, GPIO_Pin_9);

GPIO_ResetBits(GPIOD, GPIO_Pin_10);

GPIO_ResetBits(GPIOD, GPIO_Pin_11);

break;

case 1:

GPIO_ResetBits(GPIOD, GPIO_Pin_8);

GPIO_SetBits(GPIOD, GPIO_Pin_9);

GPIO_ResetBits(GPIOD, GPIO_Pin_10);

GPIO_ResetBits(GPIOD, GPIO_Pin_11);

break;

case 2:

GPIO_ResetBits(GPIOD, GPIO_Pin_8);

GPIO_ResetBits(GPIOD, GPIO_Pin_9);

GPIO_SetBits(GPIOD, GPIO_Pin_10);

GPIO_ResetBits(GPIOD, GPIO_Pin_11);

break;

case 3:

GPIO_ResetBits(GPIOD, GPIO_Pin_8);

GPIO_ResetBits(GPIOD, GPIO_Pin_9);

GPIO_ResetBits(GPIOD, GPIO_Pin_10);

GPIO_SetBits(GPIOD, GPIO_Pin_11);

break;

default:

break;

}

}

[/mw_shl_code]

[mw_shl_code=c,true]static void App_TaskPrintf(void* p_arg)

[/mw_shl_code]

static  void App_TaskStart(void* p_arg)  我的理解是先执行任务static void App_TaskStart(void* p_arg),然后碰到延时一秒转而去执行static void App_TaskPrintf(void* p_arg)这个任务,执行到任务挂起时,去执行TaskStart开始任务,此时碰到OSMutexPend(Mutex_USART1, 0, &err);等待信号量,此时两个任务都不执行,等待串口中断来临,当串口中断来了时

void USART1_IRQHandler(void)

{

OS_CPU_SR  cpu_sr;

OS_ENTER_CRITICAL();  //保存全局中断标志,关总中断/* Tell uC/OS-II that we are starting an ISR*/

OSIntNesting++;

OS_EXIT_CRITICAL();  //恢复全局中断标志

if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET){// 如果是串口接收中断

USART1_RXLoop(USART_ReceiveData(USART1)); // 将数据放入环形队列

OSTaskResume(APP_TASK_PRINTF_PRIO);

}

OSIntExit();

}

这是串口中断函数,执行完OSIntExit(); 后,再进行任务调度,可是那两个任务都是在等待信号量啊,难道执行完中断函数后会释放一个信号量吗?

linux gpio信号量,执行完? OSIntExit(); 后,再进行任务调度,可是那两个任务都是在等待信号量啊,难道执行完中断函数后会释放一个信号量吗?...相关推荐

  1. 计算机每次网络重插才能启动,为何电脑开机后再插网线才能用_每次开机都要重插网线的解决方法...

    为何电脑开机后再插网线才能用_每次开机都要重插网线的解决方法 最近有朋友向dengb.com小编咨询为何电脑开机后再插网线才能用,否则就无法联网,电脑每次开机都要重新插网线是非常麻烦的,很多人都遇到过 ...

  2. 解决阿里云存在未支付订单请支付或作废后再下单

    阿里云服务器或其他云资源无法立即购买,提示"您选择的资源存在未支付订单,请支付或作废后再下单!"什么原因?这是由于你的阿里云账号之前已经创建了该订单,只是订单没有支付,所以无法再次 ...

  3. 解决台式机开机后再连接视频线不显示的问题

    背景 有一华硕台式机,带集成显卡和独立显卡,开机启动默认使用独显.问题:在开机后再插入视频线,显示器不显示:解决:修改启动默认为集显,开机后再接入视频线也能正常显示. 步骤: 开机按del进入bios ...

  4. 现在明白Git的分支操作后再看普罗米修斯那么多分支就好理解了

    现在明白Git的分支操作后再看普罗米修斯那么多分支就好理解了 确实以后自己也没必要单独建一个仓库,就新建一个分支就可以了. .

  5. [Linux]线程概念_线程控制(线程与进程的区别与联系 | 线程创建 | 线程等待 | 线程终止 | 线程分离 | LWP)

    文章目录 线程概念 进程和线程的关系 线程的优点 线程的缺点 线程控制 Linux线程和接口关系的认识 线程创建 线程ID及进程地址空间布局 线程等待 线程终止 线程终止状态 线程分离 LWP和pth ...

  6. linux的python2.7安装pip的三种方式,Linux(Centos)在装有Python2的情况下安装Python3 两版本并存,安装完python3后pip、pip2都指向了python3

    安装pip的三种方式 pip是python的一个工具,用来安装python包特别方便. Linux系统是是内置python程序,因为许多Linux内置文件都是使用python来编写的,比如说yum. ...

  7. uefi装完系统后无法引导_系统安装完后再设置uefi启动 - 卡饭网

    Windows8系统安装完后无法上网的解决办法 Windows8系统安装完后无法上网的解决办法 现在有不少用户反映安装Win8后无法联网的问题,这个问题很大程度是网卡驱动导致的,那该怎么办呢,只能是重 ...

  8. Java等线程池执行完所有任务后再执行主线程

    2019独角兽企业重金招聘Python工程师标准>>> 因为要定时往数据库插入上百万数据,插入完之后再修改另外一部分数据, 怎么在线程池执行完所有任务后再执行主线程呢 import ...

  9. Semaphore控制同时访问的线程个数countdownlatch等待多个线程执行完本身线程再执行...

    Semaphore控制同时访问的线程个数countdownlatch等待多个线程执行完本身线程再执行 Semaphore控制同时访问的线程个数countdownlatch等待多个线程执行完本身线程再执 ...

最新文章

  1. OpenCV BRIEF角点检测
  2. Linux 命令之 rsync -- 远程数据同步工具
  3. 从源码说说dispatchTouchEvent与onTouchEvent的关系以及OnTouchListener的用法
  4. Linux 定时执行命令 crontab
  5. 让自己慢下来(2)-朋友们的回复
  6. 华为EMUI10带来开发者福音:一次开发多端部署
  7. spss方差分析_【D】SPSS统计案例分析:多因素方差分析
  8. Java线程面试题 Top 50 (转载)
  9. Linux开发_WARNING: ‘aclocal-1.14‘ is missing on your system.
  10. 【react】---函数化编程的理解,柯里化函数及返柯里化函数的理解...
  11. 浅析B/S架构数据库连接方式
  12. Centos7中完美搭建ftp服务器
  13. 读《松本行弘的程序世界》——松本行弘眼中Ruby受欢迎的原因
  14. 中美大学生阅读书单大公开,哈佛和北大差异这么大!
  15. 黑莓BlackBerry 模拟器上浏览网页
  16. 南京大学计算机技术是重点学科吗,2019南京大学重点学科和重点专业大盘点
  17. android图片裁剪xof,HttpServletResponse response相关头信息,内容信息设置
  18. 【第十三届蓝桥杯C++ B组省赛编程题详解】
  19. Exchange 2010 修改附件大小限制
  20. python--预测未来子女的身高、计算能量的消耗、为自己的手机充值、将指定的十进制数转换成二进制、八进制、十六进制

热门文章

  1. 详解之-js闭包的用途
  2. 数据库水平切分的实现原理解析---分库,分表,主从,集群,负载均衡器(转)...
  3. C# Window Form解决播放amr格式音乐问题
  4. flash请求来源Refer测试
  5. CCF202012-4 食材运输(100分题解链接)
  6. HDU1591 Encoded Love-letter【密码】
  7. 从一个例子看频率学派与贝叶斯学派的不同(Python)
  8. 构建工具 —— Groovy 与 Gradle
  9. 链表的应用 —— 实现 LRU(least recently unused)
  10. 【笔试/面试】—— 奇葩 C/C++ 语法题