OpenEdv-开源电子网

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

我的uC/OS无法申请信号量,不知道是为什么,请求指点迷津、、、

[复制链接]

108

主题

1433

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2233
金钱
2233
注册时间
2012-4-30
在线时间
7 小时
发表于 2012-9-10 13:19:33 | 显示全部楼层 |阅读模式

 SysTick_Configuration();
 OSInit();
 SendCom = OSSemCreate(2);
 OSTaskCreate(TASK0_Start, (void *)0, (OS_STK *)&TASK0_STK[TASK0_STK_SIZE-1], TASK0_Prio);
 OSTaskCreate(TASK1, (void *)0, (OS_STK *)&TASK1_STK[TASK1_STK_SIZE-1], TASK1_Prio);
 OSStart();
 return 0;


 

我创建的信号量的值是2,只申请了1个ECB,

#define OS_MAX_EVENTS             2    //应用中最多事件控制块的数目 必须大于0。 定义的时候是2个


 

                                       // ------------------------ 信号管理 ------------------------
#define OS_SEM_EN                 1    //允许 (1) 或者禁止 (0) 产生信号量相关代码
#define OS_SEM_ACCEPT_EN          1    //允许生成OSSemAccept()                           
#define OS_SEM_DEL_EN             1    //允许生成OSSemDel()                              
#define OS_SEM_QUERY_EN           1    //允许生成OSSemQuery()


 

定义也是全部置1、、


 

void TASK0_Start(void *pdata)
{
 INT8U *perr0;

 OSSemPend(SendCom, 0, perr0);
 while(1)
 {  
    
  OSTimeDly(1000);
 }
}

但是我调试的时候是,OSSemPend后,根部就没有到任务延时那里,

然后我再在OSSemPend里面调试,发现都是对的,直到最后return;然后再点下一步,就显示错误了

HardFault_Handler\
                PROC
                EXPORT  HardFault_Handler         [WEAK]
                B       .
                ENDP

不知道是为什么、、、

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

108

主题

1433

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2233
金钱
2233
注册时间
2012-4-30
在线时间
7 小时
 楼主| 发表于 2012-9-10 13:20:21 | 显示全部楼层
我的UC/OS是直接用的原子哥的uC/OS灯实验里面的。
回复 支持 反对

使用道具 举报

108

主题

1433

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2233
金钱
2233
注册时间
2012-4-30
在线时间
7 小时
 楼主| 发表于 2012-9-10 13:23:12 | 显示全部楼层
void TASK0_Start(void *pdata)
 {
  INT8U *perr0;
 
 
  while(1)
  {  
   OSSemPend(SendCom, 0, perr0);  
   OSTimeDly(1000);
  }
 }

这样也不行、、
回复 支持 反对

使用道具 举报

108

主题

1433

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2233
金钱
2233
注册时间
2012-4-30
在线时间
7 小时
 楼主| 发表于 2012-9-10 14:01:27 | 显示全部楼层
啊,好了,我懂了,
INT8U *perr0; 
这样不行,要给他分配个内存才行,

就直接

void TASK0_Start(void *pdata) 
 { 
  INT8U perr0; 
  
  
  while(1) 
  {   
   OSSemPend(SendCom, 0, &perr0);   
   OSTimeDly(1000); 
  } 
 } 
就可以了~~~O(∩_∩)O~
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165225
金钱
165225
注册时间
2010-12-1
在线时间
2107 小时
发表于 2012-9-10 14:21:58 | 显示全部楼层
呵呵。
只要发现Hard Fault,最先就应该检查内存!!
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

108

主题

1433

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2233
金钱
2233
注册时间
2012-4-30
在线时间
7 小时
 楼主| 发表于 2012-9-10 15:34:35 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
原来HardFault都常常和内存相关呀,
以前经常见到HardFault都不知道该怎么检查、、

我之前是到处移 OSSemPend函数里面的return;的位置才知道的~
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-1 14:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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