[应用方案] 基于UC/OSii的外部按键中断

[复制链接]
1241|7
 楼主| Beckham_Owen 发表于 2016-7-9 21:00 | 显示全部楼层 |阅读模式
这个实验中有三个任务:
1、DS0闪
2、KEY1来控制DS1亮以及打印KEY1
3、KEY0来控制打印KEY0

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

  12. #define LED0_TASK_PRIO       7
  13. //设置任务堆栈大小
  14. #define LED0_STK_SIZE      64
  15. //任务堆栈
  16. OS_STK LED0_TASK_STK[LED0_STK_SIZE];
  17. //任务函数
  18. void led0_task(void *pdata);

  19. #define KEY_TASK_PRIO       5
  20. //设置任务堆栈大小
  21. #define KEY_STK_SIZE   64
  22. //任务堆栈
  23. OS_STK KEY_TASK_STK[KEY_STK_SIZE];
  24. //任务函数
  25. void KEY_task(void *pdata);


  26. #define KEY_UART_TASK_PRIO       4
  27. //设置任务堆栈大小
  28. #define KEY_UART_STK_SIZE   64
  29. //任务堆栈
  30. OS_STK KEY_UART_TASK_STK[KEY_UART_STK_SIZE];
  31. //任务函数
  32. void KEY_UART_task(void *pdata);

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

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


  61. //LED0任务
  62. void led0_task(void *pdata)
  63. {
  64. while(1)
  65. {
  66. LED0=0;
  67. delay_ms(80);
  68. LED0=1;
  69. delay_ms(920);
  70. };
  71. }

  72. void KEY_task(void *pdata)
  73. {
  74. while(1)
  75. {
  76. delay_ms(920);
  77. };
  78. }


  79. void KEY_UART_task(void *pdata)
  80. {
  81.   while(1)
  82. {
  83.             delay_ms(920);
  84. };
  85. }


 楼主| Beckham_Owen 发表于 2016-7-9 21:01 | 显示全部楼层
注意里面的延时!事实上所有的操作系统的多任务都是通过延时来实现的!
在中断处理程序中,有:
  1. void EXTI3_IRQHandler(void)
  2. {
  3.   OS_CPU_SR  cpu_sr;
  4.   OS_ENTER_CRITICAL();  //保存全局中断标志,关总中断
  5.    //存放中断嵌套的层数(0~255)
  6.     OSIntNesting++;       //OSSemPost(NMEA_MBOX);
  7.     OS_EXIT_CRITICAL();   //恢复全局中断标志
  8. delay_ms(10);//消抖
  9. if(KEY1==0)  //按键KEY1
  10. {  
  11. LED1=!LED1;
  12.                 printf("KEY1");
  13. }  
  14. EXTI->PR=1<<3;  //清除LINE3上的中断标志位
  15.          //脱离中断函数
  16.     OSIntExit();  //在os_core.c文件里定义,如果有更高优先级的任务就绪了,则执行一次任务切换   
  17. }
  18. //外部中断4服务程序
  19. void EXTI4_IRQHandler(void)
  20. {
  21.     OS_CPU_SR  cpu_sr;
  22.   OS_ENTER_CRITICAL();  //保存全局中断标志,关总中断
  23.    //存放中断嵌套的层数(0~255)
  24.     OSIntNesting++;       //OSSemPost(NMEA_MBOX);
  25.     OS_EXIT_CRITICAL();   //恢复全局中断标志
  26. delay_ms(10);//消抖
  27. if(KEY0==0)  //按键KEY0
  28. {
  29. LED0=!LED0;
  30. LED1=!LED1;
  31.                 printf("KEY0");
  32. }  
  33. EXTI->PR=1<<4;  //清除LINE4上的中断标志位
  34.         OSIntExit();  //在os_core.c文件里定义,如果有更高优先级的任务就绪了,则执行一次任务切换   
  35. }   
  36. //外部中断初始化程序
  37. //初始化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);
遇到这种,我就觉得高大上
天灵灵地灵灵 发表于 2016-7-12 16:38 | 显示全部楼层
UCOS配上Windows显示很不错。
Thethree 发表于 2016-7-12 21:24 | 显示全部楼层
这个ucos ii系统有没有经过测试,稳定吗
zhuomuniao110 发表于 2016-7-13 00:28 | 显示全部楼层
怎么搞头文件让这个系统跟硬件匹配啊。
neeringstu 发表于 2016-7-13 12:55 | 显示全部楼层
去除按键的抖动有什么好办法呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

32

主题

234

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部