打印
[应用方案]

基于UC/OSii的外部按键中断

[复制链接]
1057|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Beckham_Owen|  楼主 | 2016-7-9 21:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这个实验中有三个任务:
1、DS0闪
2、KEY1来控制DS1亮以及打印KEY1
3、KEY0来控制打印KEY0

其实基于系统的外部中断和裸机跑是差不了多少的,就是要在任务中延时和开关中断!
第一:创建三个任务的优先级,栈的大小等等:
/////////////////////////ucosII任务设置///////////////////////////////////
//START 任务
//设置任务优先级
#define START_TASK_PRIO       10 //开始任务的优先级设置为最低
//设置任务堆栈大小
#define START_STK_SIZE   64
//任务堆栈
OS_STK START_TASK_STK[START_STK_SIZE];
//任务函数
void start_task(void *pdata);
   

#define LED0_TASK_PRIO       7
//设置任务堆栈大小
#define LED0_STK_SIZE      64
//任务堆栈
OS_STK LED0_TASK_STK[LED0_STK_SIZE];
//任务函数
void led0_task(void *pdata);

#define KEY_TASK_PRIO       5
//设置任务堆栈大小
#define KEY_STK_SIZE   64
//任务堆栈
OS_STK KEY_TASK_STK[KEY_STK_SIZE];
//任务函数
void KEY_task(void *pdata);


#define KEY_UART_TASK_PRIO       4
//设置任务堆栈大小
#define KEY_UART_STK_SIZE   64
//任务堆栈
OS_STK KEY_UART_TASK_STK[KEY_UART_STK_SIZE];
//任务函数
void KEY_UART_task(void *pdata);

然后是在main函数中初始化那些中断串口驱动什么的!
int main(void)
{  
stm32_Clock_Init(9); //系统时钟设置
delay_init(72);    //延时初始化
LED_Init();  
LED_Init();    //初始化与LED连接的硬件接口
        KEY_Init();
        EXTIX_Init();
        uart_init(72,115200);
OSInit();   
  OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO );//创建起始任务
OSStart();     
}

然后就是创建任务
//开始任务
void start_task(void *pdata)
{
    OS_CPU_SR cpu_sr=0;
pdata = pdata;
  OS_ENTER_CRITICAL();//进入临界区(无法被中断打断)   
  OSTaskCreate(led0_task,(void *)0,(OS_STK*)&LED0_TASK_STK[LED0_STK_SIZE-1],LED0_TASK_PRIO);  
  //OSTaskCreate(led1_task,(void *)0,(OS_STK*)&LED1_TASK_STK[LED1_STK_SIZE-1],LED1_TASK_PRIO);
        OSTaskCreate(KEY_task,(void *)0,(OS_STK*)&KEY_TASK_STK[KEY_STK_SIZE-1],KEY_TASK_PRIO);
OSTaskCreate(KEY_UART_task,(void *)0,(OS_STK*)&KEY_UART_TASK_STK[KEY_UART_STK_SIZE-1],KEY_UART_TASK_PRIO);
        OSTaskSuspend(START_TASK_PRIO); //挂起起始任务.
OS_EXIT_CRITICAL();//退出临界区(可以被中断打断)
}


//LED0任务
void led0_task(void *pdata)
{
while(1)
{
LED0=0;
delay_ms(80);
LED0=1;
delay_ms(920);
};
}

void KEY_task(void *pdata)
{
while(1)
{
delay_ms(920);
};
}


void KEY_UART_task(void *pdata)
{
  while(1)
{
            delay_ms(920);
};
}


沙发
Beckham_Owen|  楼主 | 2016-7-9 21:01 | 只看该作者
注意里面的延时!事实上所有的操作系统的多任务都是通过延时来实现的!
在中断处理程序中,有:
void EXTI3_IRQHandler(void)
{
  OS_CPU_SR  cpu_sr;
  OS_ENTER_CRITICAL();  //保存全局中断标志,关总中断
   //存放中断嵌套的层数(0~255)
    OSIntNesting++;       //OSSemPost(NMEA_MBOX);
    OS_EXIT_CRITICAL();   //恢复全局中断标志
delay_ms(10);//消抖
if(KEY1==0)  //按键KEY1
{  
LED1=!LED1;
                printf("KEY1");
}  
EXTI->PR=1<<3;  //清除LINE3上的中断标志位
         //脱离中断函数
    OSIntExit();  //在os_core.c文件里定义,如果有更高优先级的任务就绪了,则执行一次任务切换   
}
//外部中断4服务程序
void EXTI4_IRQHandler(void)
{
    OS_CPU_SR  cpu_sr;
  OS_ENTER_CRITICAL();  //保存全局中断标志,关总中断
   //存放中断嵌套的层数(0~255)
    OSIntNesting++;       //OSSemPost(NMEA_MBOX);
    OS_EXIT_CRITICAL();   //恢复全局中断标志
delay_ms(10);//消抖
if(KEY0==0)  //按键KEY0
{
LED0=!LED0;
LED1=!LED1;
                printf("KEY0");
}  
EXTI->PR=1<<4;  //清除LINE4上的中断标志位
        OSIntExit();  //在os_core.c文件里定义,如果有更高优先级的任务就绪了,则执行一次任务切换   
}   
//外部中断初始化程序
//初始化PA0/PE2/PE3/PE4为中断输入.
注意里面的开中断和关中断。

使用特权

评论回复
板凳
ccw1986| | 2016-7-11 12:54 | 只看该作者
外部中断返回的时候如何进行中断级别的任务调度呢?

使用特权

评论回复
地板
天灵灵地灵灵| | 2016-7-12 16:14 | 只看该作者
//设置任务堆栈大小
#define KEY_STK_SIZE   64
//任务堆栈
OS_STK KEY_TASK_STK[KEY_STK_SIZE];
//任务函数
void KEY_task(void *pdata);
遇到这种,我就觉得高大上

使用特权

评论回复
5
天灵灵地灵灵| | 2016-7-12 16:38 | 只看该作者
UCOS配上Windows显示很不错。

使用特权

评论回复
6
Thethree| | 2016-7-12 21:24 | 只看该作者
这个ucos ii系统有没有经过测试,稳定吗

使用特权

评论回复
7
zhuomuniao110| | 2016-7-13 00:28 | 只看该作者
怎么搞头文件让这个系统跟硬件匹配啊。

使用特权

评论回复
8
neeringstu| | 2016-7-13 12:55 | 只看该作者
去除按键的抖动有什么好办法呢?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

32

主题

234

帖子

1

粉丝