你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

M3跑uCII 老是跑到BusFault_Handler中 求指点

[复制链接]
千羽猎鹰 提问时间:2015-3-26 09:18 /
主要有两个不懂的毛病
一个是我想控制两个IO口,跟点灯差不多,就是持续一段时间然后再熄灭,两个写的完全一样,结果只有后面建立的那个任务可以正常跑,前面建立的任务就会跑进UsageFault_Handler里面,大概是这样操作的

OSTaskCreateExt((void (*)(void *)) OpenLockTask,                 // 建立任务
     (void   *) NULL,                  //  ÊäÈë²ÎÊý
     (OS_STK   *) &TASK_OPENLOCK_STK[TASK_OPENLOCK_STK_SIZE-1],  //  ¶ÑÕ»Ê×µØÖ·
     (INT8U    ) TASK_OPENLOCK_PRIO,                     //  ÈÎÎñÓÅÏȼ¶
     (INT16U    ) TASK_OPENLOCK_PRIO,            //  task's ID
     (OS_STK   *) &TASK_OPENLOCK_STK[0],                       //  ¶ÑջβµØÖ·
     (INT32U    ) TASK_OPENLOCK_STK_SIZE,              //
     (void   *) NULL,                //
     (INT16U    ) OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR   //
     );      

OSSemPost(LockOpenFlag);   //发送信号量

void DoorBellTask(void * p_arg)  //任务,让IO口保持300ms电平
{
u8  err;
(void)p_arg;
p_arg = p_arg;
   
DoorBellFlag = OSSemCreate (0);

while(1)
{
  OSSemPend(DoorBellFlag, 0, &err);  
  __nop();
  DOORBELL_ON();          //¿ªËø
  OSTimeDlyHMSM(0,0,0,300);       //¹ÒÆðÈÎÎñ300ms
  DOORBELL_OFF();          //¹ØËø
}
}

两个任务基本一样,都是复制然后改的名字
是我这用法有问题吗,还是有什么配置啊,或者其他可能的问题我没有注意到的  求大神帮忙啊
收藏 评论11 发布时间:2015-3-26 09:18

举报

11个回答
千羽猎鹰 回答时间:2015-3-26 09:21:20
第二个问题是 两个任务  都是等待消息队列后向下执行 结果我发送任务1的消息队列 结果跑到任务3里面去了 而且跑断点 根本就没有跑到任务3发送消息队列的地方
千羽猎鹰 回答时间:2015-3-26 09:50:16
不用直接解决 给个方向 或者可能的原因什么的也好啊 帮帮忙啊
kqh1120 回答时间:2015-3-26 10:44:37
7.gif 不懂帮顶 3.gif
废鱼 回答时间:2015-3-26 11:01:46
一般出错进入的是HardFault_Handler,bus的没进去过。最好把你的工程发上来,这样好看。
千羽猎鹰 回答时间:2015-3-26 11:25:13
安 发表于 2015-3-26 11:01
一般出错进入的是HardFault_Handler,bus的没进去过。最好把你的工程发上来,这样好看。 ...

两个信号量
分别post,第一个信号量可以pend到,第二个post后就跑到UsageFault_Handler了
如果改变建立任务的顺序,还是后建立的那个任务可以用,前面的就跑到UsageFault_Handler
是我的使用方式就不对  还是我有什么理解不对的地方啊
谢谢大神 发现你最爱帮助人了

test.rar

下载

5.74 MB, 下载次数: 1, 下载积分: ST金币 -1

千羽猎鹰 回答时间:2015-3-26 14:06:57
怎么办
废鱼 回答时间:2015-3-26 14:16:12
如果信号量是用于对共享资源的访问,那么该信号量的初始值应设为1(例如,把它当作二值信号量使用)。最后,如果该信号量是用来表示允许任务访问n 个相同的资源,那么该初始值显然应该是n,并把该信号量作为一个可计数的信号量使用。

楼主创建的时候,把0改成1试试。
千羽猎鹰 回答时间:2015-3-26 14:17:22
开始跑到都正常 在跑到释放第二个信号量的时候  跑进去会判断是否存在任务等待此信号量  
然后调用OS_Sched();  判断是否有更高优先级的任务 跑到这里就进UsageFault_Handler中断了
千羽猎鹰 回答时间:2015-3-26 14:29:48
在单步跑的时候 OS_Sched();  是可以正常跑的 但是没有发生任务切换 就直接跑过去了
不明白问题在哪啊 剩下的都看不懂了
千羽猎鹰 回答时间:2015-3-26 14:38:22
安 发表于 2015-3-26 14:16
如果信号量是用于对共享资源的访问,那么该信号量的初始值应设为1(例如,把它当作二值信号量使用)。最后 ...

没明白什么意思 把初值由0改成1后  检测到信号  直接运行一次 是可以的 信号值就为0了
但是我用post 释放信号量的时候 还是会跑进HardFault_Handler
废鱼 回答时间:2015-3-26 15:06:00
我们一般是OSMutexCreate(1,&err);这种方式建立的信号量。使用的时候先获取信号量,用完就释放,而不是在其他任务里面强制释放的。

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版