OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4668|回复: 7

ucosii外部中断跑飞,代码如下。即使不使用信号量,只开一个StartTask,进入外部中断也会跑飞,找不到原因,求帮助

[复制链接]

1

主题

4

帖子

0

精华

新手入门

积分
29
金钱
29
注册时间
2015-12-14
在线时间
0 小时
发表于 2015-12-14 11:33:56 | 显示全部楼层 |阅读模式
5金钱
#include "stm32f10x.h"
#include "Delay.h"
#include "Exti.h"
#include "Adc.h"
#include "Led.h"
#include "Uart_1.h"
#include "includes.h"

#define StartTaskPrio        8
#define StartStkSzie         64     
OS_STK  StartStk[StartStkSzie];
void    StartTask(void *pdata);

#define DispTaskPrio         6        //显示任务
#define DispStkSzie          128     
OS_STK  DispStk[DispStkSzie];
void    DispTask(void *pdata);

INT16U Temp;                 //采样值变量
OS_EVENT *Mbox;              //定义消息邮箱

int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 
 
Adc_Init();
Delay_Init();              //初始化延时函数
Exti_Init();               //外部中断初始化                     
Led_Init();                //初始化LED
Uart_1_Init(115200);       //初始化串口

OSInit();                 //初始化ucosii        
OSTaskCreate(StartTask,(void*)0,(OS_STK*)&StartStk[StartStkSzie-1],StartTaskPrio);    //创建开始任务
OSStart();                 //启动操作系统
}


void StartTask(void *pdata)
{  
OS_CPU_SR cpu_sr=0;        

OS_ENTER_CRITICAL();       //关中断                                                
OSTaskCreate(DispTask,(void*)0,(OS_STK*)&DispStk[DispStkSzie-1],DispTaskPrio); 
  OS_EXIT_CRITICAL();        //开中断

while(1)
{
Led_1_On;
OSTimeDly(OS_TICKS_PER_SEC/2);
Led_1_Off;
OSTimeDly(OS_TICKS_PER_SEC/2);
  }
}

void DispTask(void *pdata)
{
INT16U Samp;
INT8U Err;
pdata=pdata;
Mbox=OSMboxCreate((void*)0);//创建消息邮箱

while(1)
{
Samp=*(INT16U*)OSMboxPend(Mbox,0,&Err);     //将无类型的消息邮箱(地址)转换成AD变量的INT16类型,再获取该地址的数据
printf("\n%d\n",Samp);

OSTimeDly(2);
}
}
/*======================================================
                      外部中断函数
=======================================================*/
void EXTI3_IRQHandler(void)                   
{
OSIntEnter();
Delay_Ms(10);
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)==0)
{
Temp=Get_Adc_Value(1);                             //采样
OSMboxPost(Mbox,(void*)&Temp);              //发送消息
}
  EXTI_ClearITPendingBit(EXTI_Line4);          //清除中断标志
OSIntExit(); 
}






最佳答案

查看完整内容[请看2#楼]

回复【4楼】bj2008wyou: --------------------------------- 我已经找到原因了,退出中断时中断标志清除错了,谢谢你哦
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
29
金钱
29
注册时间
2015-12-14
在线时间
0 小时
 楼主| 发表于 2015-12-14 11:33:57 | 显示全部楼层
回复【4楼】bj2008wyou:
---------------------------------
我已经找到原因了,退出中断时中断标志清除错了,谢谢你哦
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2015-12-14 17:09:16 | 显示全部楼层
中断里面加延时,硬伤
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复

使用道具 举报

13

主题

206

帖子

1

精华

高级会员

Rank: 4

积分
613
金钱
613
注册时间
2014-10-26
在线时间
32 小时
发表于 2015-12-14 17:39:11 | 显示全部楼层
仿真DEBUG一下,目测是硬件错误
学习!
回复

使用道具 举报

13

主题

91

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
233
金钱
233
注册时间
2012-11-17
在线时间
18 小时
发表于 2015-12-14 22:04:16 | 显示全部楼层
感觉像是你的系统定时器开启放的位置不对,你是不是放在OSInit()里面了?因为在你创建的第一个任务里没看见定时器的开启。

好吧,是我搞错了,因为你问的是进入外部中断,也就是说你是已经移植好,系统是能跑的。
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
29
金钱
29
注册时间
2015-12-14
在线时间
0 小时
 楼主| 发表于 2015-12-15 14:01:01 | 显示全部楼层
回复【2楼】龙之谷:
---------------------------------
那个延时是为了去抖,我已经找到原因了,因为我太粗心,退出中断时中断标志清除错了
回复

使用道具 举报

12

主题

126

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
281
金钱
281
注册时间
2013-1-5
在线时间
22 小时
发表于 2015-12-18 21:23:52 | 显示全部楼层
尽管找到原因了还是建议中断中不要加延时
天道酬勤
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
29
金钱
29
注册时间
2015-12-14
在线时间
0 小时
 楼主| 发表于 2015-12-19 21:42:03 | 显示全部楼层
回复【7楼】落月枫情:
---------------------------------
ok,谢啦
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 16:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表