OpenEdv-开源电子网

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

STM32 MINI ucosII例程的信号量测试问题

[复制链接]

7

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
88
金钱
88
注册时间
2010-12-14
在线时间
8 小时
发表于 2014-5-13 11:57:16 | 显示全部楼层 |阅读模式
5金钱
在原子大哥的ucosII例程里面加了个信号量测试,为什么在启动操作过程中,LED的电平状态有毛刺?我用keil4软件仿真端口波形的。

#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h" 
#include "key.h"
#include "includes.h"  
//Mini STM32开发板扩展实例 8
//ucos 实验
//正点原子@ALIENTEK
//技术支持:www.openedv.com

 
//设置任务堆栈大小
#define LED_STK_SIZE     64
#define LED1_STK_SIZE    64
#define START_STK_SIZE   128

//设置任务优先级
#define LED_TASK_Prio       9
#define LED1_TASK_Prio      5
#define START_TASK_Prio     10

//任务堆栈
OS_STK  TASK_LED1_STK[LED_STK_SIZE];
OS_STK  TASK_LED_STK[LED_STK_SIZE];
OS_STK  TASK_START_STK[START_STK_SIZE];
//任务申明
void TaskStart(void *pdata);
void TaskLed(void *pdata);
void TaskLed1(void *pdata);

//系统时钟配置函数
void SysTick_Configuration(void);

OS_EVENT *Sem_Led;
u8 err;
 
//Mini STM32开发板ucos范例
//基于ucos2.52内核.
//正点原子@ALIENTEK
//www.openedv.com
//2010.12.15  
int main(void)
{   
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72);     //延时初始化 
uart_init(72,9600); //串口初始化为9600
LED_Init();   //初始化与LED连接的硬件接口 
LED0=0;
LED1=0; 
SysTick_Configuration();
OSInit();
OSTaskCreate( TaskStart, //task pointer
(void *)0, //parameter
(OS_STK *)&TASK_START_STK[START_STK_SIZE-1], //task stack top pointer
START_TASK_Prio ); //task priority

OSStart();
return 0;   
}
//开始任务
void TaskStart(void * pdata)
{
pdata = pdata; 
OS_ENTER_CRITICAL();
Sem_Led=OSSemCreate(1);  //创建信号量   
OSTaskCreate(TaskLed, (void * )0, (OS_STK *)&TASK_LED_STK[LED_STK_SIZE-1], LED_TASK_Prio);
OSTaskCreate(TaskLed1, (void * )0, (OS_STK *)&TASK_LED1_STK[LED1_STK_SIZE-1], LED1_TASK_Prio);
OSTaskSuspend(START_TASK_Prio); //suspend but not delete
OS_EXIT_CRITICAL();
}
//任务1
//控制DS0的亮灭.
void TaskLed(void *pdata)
{
while(1)
{
   OSSemPend(Sem_Led,0,&err); //请求信号量,若信号量有效(cnt>0),那么任务继续运行,否则进入等待状态
LED0=!LED0;
OSTimeDlyHMSM(0,0,0,200);
}
}
//任务2
//控制DS1的亮灭.
void TaskLed1(void *pdata)
{
while(1)
{
LED1=!LED1;
OSTimeDlyHMSM(0,0,0,20);
OSSemPost(Sem_Led); //发送一次信号量
}
}  
//系统时钟中断服务函数
void SysTick_Handler(void)
{
OS_ENTER_CRITICAL(); /* Tell uC/OS-II that we are starting an ISR  */
    OSIntNesting++;
    OS_EXIT_CRITICAL();

    OSTimeTick();        /* Call uC/OS-II's OSTimeTick()               */

    OSIntExit();         /* Tell uC/OS-II that we are leaving the ISR  */
}
//系统时钟配置,设计1ms产生一次中断
void SysTick_Configuration(void)
{
  SysTick->CTRL&=~(1<<2);//SYSTICK使用外部时钟源
SysTick->CTRL|=1<<1;   //开启SYSTICK中断
SysTick->LOAD=9000;    //产生1ms中断
//bit2清空,选择外部时钟  HCLK/8
  SysTick->CTRL|=1<<0;   //开启SYSTICK
}





















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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-5-13 22:58:10 | 显示全部楼层
你可以仿真,看看执行到哪一步的时候,出现这个毛刺.
我猜是LED_Init初始化的时候出现的.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-8 04:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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