linux gpio信号量,执行完? OSIntExit(); 后,再进行任务调度,可是那两个任务都是在等待信号量啊,难道执行完中断函数后会释放一个信号量吗?...
[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(); 后,再进行任务调度,可是那两个任务都是在等待信号量啊,难道执行完中断函数后会释放一个信号量吗?...相关推荐
- 计算机每次网络重插才能启动,为何电脑开机后再插网线才能用_每次开机都要重插网线的解决方法...
为何电脑开机后再插网线才能用_每次开机都要重插网线的解决方法 最近有朋友向dengb.com小编咨询为何电脑开机后再插网线才能用,否则就无法联网,电脑每次开机都要重新插网线是非常麻烦的,很多人都遇到过 ...
- 解决阿里云存在未支付订单请支付或作废后再下单
阿里云服务器或其他云资源无法立即购买,提示"您选择的资源存在未支付订单,请支付或作废后再下单!"什么原因?这是由于你的阿里云账号之前已经创建了该订单,只是订单没有支付,所以无法再次 ...
- 解决台式机开机后再连接视频线不显示的问题
背景 有一华硕台式机,带集成显卡和独立显卡,开机启动默认使用独显.问题:在开机后再插入视频线,显示器不显示:解决:修改启动默认为集显,开机后再接入视频线也能正常显示. 步骤: 开机按del进入bios ...
- 现在明白Git的分支操作后再看普罗米修斯那么多分支就好理解了
现在明白Git的分支操作后再看普罗米修斯那么多分支就好理解了 确实以后自己也没必要单独建一个仓库,就新建一个分支就可以了. .
- [Linux]线程概念_线程控制(线程与进程的区别与联系 | 线程创建 | 线程等待 | 线程终止 | 线程分离 | LWP)
文章目录 线程概念 进程和线程的关系 线程的优点 线程的缺点 线程控制 Linux线程和接口关系的认识 线程创建 线程ID及进程地址空间布局 线程等待 线程终止 线程终止状态 线程分离 LWP和pth ...
- linux的python2.7安装pip的三种方式,Linux(Centos)在装有Python2的情况下安装Python3 两版本并存,安装完python3后pip、pip2都指向了python3
安装pip的三种方式 pip是python的一个工具,用来安装python包特别方便. Linux系统是是内置python程序,因为许多Linux内置文件都是使用python来编写的,比如说yum. ...
- uefi装完系统后无法引导_系统安装完后再设置uefi启动 - 卡饭网
Windows8系统安装完后无法上网的解决办法 Windows8系统安装完后无法上网的解决办法 现在有不少用户反映安装Win8后无法联网的问题,这个问题很大程度是网卡驱动导致的,那该怎么办呢,只能是重 ...
- Java等线程池执行完所有任务后再执行主线程
2019独角兽企业重金招聘Python工程师标准>>> 因为要定时往数据库插入上百万数据,插入完之后再修改另外一部分数据, 怎么在线程池执行完所有任务后再执行主线程呢 import ...
- Semaphore控制同时访问的线程个数countdownlatch等待多个线程执行完本身线程再执行...
Semaphore控制同时访问的线程个数countdownlatch等待多个线程执行完本身线程再执行 Semaphore控制同时访问的线程个数countdownlatch等待多个线程执行完本身线程再执 ...
最新文章
- OpenCV BRIEF角点检测
- Linux 命令之 rsync -- 远程数据同步工具
- 从源码说说dispatchTouchEvent与onTouchEvent的关系以及OnTouchListener的用法
- Linux 定时执行命令 crontab
- 让自己慢下来(2)-朋友们的回复
- 华为EMUI10带来开发者福音:一次开发多端部署
- spss方差分析_【D】SPSS统计案例分析:多因素方差分析
- Java线程面试题 Top 50 (转载)
- Linux开发_WARNING: ‘aclocal-1.14‘ is missing on your system.
- 【react】---函数化编程的理解,柯里化函数及返柯里化函数的理解...
- 浅析B/S架构数据库连接方式
- Centos7中完美搭建ftp服务器
- 读《松本行弘的程序世界》——松本行弘眼中Ruby受欢迎的原因
- 中美大学生阅读书单大公开,哈佛和北大差异这么大!
- 黑莓BlackBerry 模拟器上浏览网页
- 南京大学计算机技术是重点学科吗,2019南京大学重点学科和重点专业大盘点
- android图片裁剪xof,HttpServletResponse response相关头信息,内容信息设置
- 【第十三届蓝桥杯C++ B组省赛编程题详解】
- Exchange 2010 修改附件大小限制
- python--预测未来子女的身高、计算能量的消耗、为自己的手机充值、将指定的十进制数转换成二进制、八进制、十六进制
热门文章
- 详解之-js闭包的用途
- 数据库水平切分的实现原理解析---分库,分表,主从,集群,负载均衡器(转)...
- C# Window Form解决播放amr格式音乐问题
- flash请求来源Refer测试
- CCF202012-4 食材运输(100分题解链接)
- HDU1591 Encoded Love-letter【密码】
- 从一个例子看频率学派与贝叶斯学派的不同(Python)
- 构建工具 —— Groovy 与 Gradle
- 链表的应用 —— 实现 LRU(least recently unused)
- 【笔试/面试】—— 奇葩 C/C++ 语法题