您需要 登录 才可以下载或查看,没有账号?注册
收藏0 举报
#include "Look_cond.h" #include "utils/debug.h" #include "numicro/sfr/gpio" #define FLAG_KEY1 1 #define FLAG_KEY2 1<<1 #define FLAG_LED3 1<<2 #define FLAG_LED4 1<<3 flag_t Flag(0); // eint_t 类提供了 INT0/INT1 的接口 // 当 INT0/INT1 发生时,对象将发送相应的 int 消息到 mbox。 class eint_t : public interrupt_t { public: __INLINE eint_t(); protected: bool isr(int vector); void dsr(int vector, uintptr_t count); }; // eint 构造函数 __DEBUG//debug调试不优化便于调试 __INLINE eint_t::eint_t() { using namespace sfr::gpio; attach(EINT0_IRQn);//绑定外部中断0 attach(EINT1_IRQn);//绑定外部中断1 GPIOB.IEN(0).IF_EN15(1).IF_EN14(1);//开启Key1,Key2中断 vector_t::enable(EINT0_IRQn);//使能外部中断0即Key1中断 vector_t::enable(EINT1_IRQn);//使能外部中断1即Key2中断 } // eint 中断服务例程 __DEBUG//debug调试不优化便于调试 bool eint_t::isr(int vector) { using namespace sfr::gpio; GPIOB.ISRC = GPIOB.ISRC; // 清中断 flag return true; } // eint 中断滞后服务例程 __DEBUG//debug调试不优化便于调试 void eint_t::dsr(int vector, uintptr_t count) { using namespace sfr::gpio; if (vector == EINT0_IRQn)//Key2中断 { Flag.do_set_bits(2);//在中断中唤醒任务2 } else if (vector == EINT1_IRQn)//Key1中断 { Flag.do_set_bits(1);//在中断中唤醒任务1 } } eint_t eint; // 创建 eint 对象 instance_task1_Look_cond_t task1_Look_cond(1); // 任务实例 // 任务类 task1_Look_cond_t 的例程 __DEBUG//debug调试不优化便于调试 void task1_Look_cond_t::routine() { // TODO: 在此编写 task1_Look_cond_t 例程的内容 using namespace sfr::gpio; int cnt1 = 0;//按键1的计数变量 int cnt2 = 0;//按键2的计数变量 while (true) { // TODO: 在此编写 task1_Look_cond_t 例程的内容 int flag = Flag.wait(FLAG_KEY1|FLAG_KEY2, flag_t::ANY_CONSUME);//阻塞等待Key1中断 if (flag & FLAG_KEY1) { GPIOA.DOUT().DOUT2 ^= 1;//LED1闪烁 cnt1 ++; if (cnt1%3 == 0)//每按键3次,LED3 亮0.5秒钟 { Flag.do_set_bits(FLAG_LED3);//唤醒任务2 } } else if (flag & FLAG_KEY2) { GPIOA.DOUT().DOUT3 ^= 1;//LED2闪烁 cnt2 ++; if (cnt2%3 == 0)//每按键3次,LED4 亮0.5秒钟 { Flag.do_set_bits(FLAG_LED4);//唤醒任务3 } } } } instance_task2_Look_cond_t task2_Look_cond(2); // 任务实例 // 任务类 task1_Look_cond_t 的例程 __DEBUG//debug调试不优化便于调试 void task2_Look_cond_t::routine() { using namespace sfr::gpio; while (true) { int flag = Flag.wait(FLAG_LED3,flag_t::ANY_CONSUME);//阻塞等待LED3的标志 if (flag) { GPIOA.DOUT().DOUT4(0);//LED3亮 delay(LOOK_TICKS_PER_SEC / 2);//延时亮0.5S GPIOA.DOUT().DOUT4(1);//LED3灭 } } } instance_task3_Look_cond_t task3_Look_cond(3); // 任务实例 // 任务类 task3_Look_cond_t 的例程 __DEBUG//debug调试不优化便于调试 void task3_Look_cond_t::routine() { // TODO: 在此编写 task3_Look_cond_t 例程的内容 using namespace sfr::gpio; while (true) { int flag = Flag.wait(FLAG_LED4, flag_t::ANY_CONSUME);//阻塞等待LED4的标志 if (flag) { GPIOA.DOUT().DOUT5(0);//LED4亮 delay(LOOK_TICKS_PER_SEC / 2);//延时亮0.5S GPIOA.DOUT().DOUT5(1);//LED4灭 } } }
本版积分规则 发表回复 回帖并转播 回帖后跳转到最后一页
等级类勋章
发帖类勋章
时间类勋章
人才类勋章
17
2103
5
扫码关注 21ic 官方微信
扫码关注嵌入式微处理器
扫码关注电源系统设计
扫码关注21ic项目外包
扫码浏览21ic手机版
本站介绍 | 申请友情链接 | 欢迎投稿 | 隐私声明 | 广告业务 | 网站地图 | 联系我们 | 诚聘英才
京公网安备 11010802024343号