事情是这样的
很简单的etimer事件,我一直是这样写的,一直没有问题:
struct etimer timeout2; //声明ETMIER事件
PROCESS(hello_world_process2, "Hello world process2");//申请线程process1测试etimer
PROCESS_THREAD(hello_world_process2, ev, data)//进程1的功能体
{
PROCESS_BEGIN();//开始
etimer_set(&timeout2,CLOCK_SECOND*1);//从当前时间起的,为XXX的时间事件
leds_init();//初始LED相关,CONTIKI驱动包leds.c功能
while(1)
{
PROCESS_WAIT_EVENT();//进行等待
if(ev == PROCESS_EVENT_TIMER) {//如果时间到了就打印信息,如果事件产生??
leds_toggle(LEDS_D2);//leds_init()初始化好所以可用了 RC7
printf("process2,The LEDS_D2 is:%u\n",leds_get());//打印LED2的状态
}
etimer_reset(&timeout2);//复位时间,周而复始
}
PROCESS_END();//结束,与PROCESS_BEGIN()配对!
}
无意中看到大神这么写,我也试了一下:
PROCESS(hello_world_process2, "Hello world process2");//申请线程process1测试etimer
PROCESS_THREAD(hello_world_process2, ev, data)//进程1的功能体
{
struct etimer timeout2; //声明ETMIER事件
PROCESS_BEGIN();//开始
。
。
。
也就是把struct etimer timeout2定义放在PROCESS_THREAD内部了,
结果呢,在IAR运行STM32仿真时候,一直中断到:
void HardFault_Handler(void)
{
/* Go to infinite loop when Hard Fault exception occurs 发生硬故障异常时转到无限循环*/
while (1)
{
}
}
哈哈,刚开始以为硬件坏了,拿以前的代码测试,发现硬件完全没问题。
解决办法就是
struct etimer timeout2; //声明ETMIER事件
PROCESS(hello_world_process2, "Hello world process2");//申请线程process1测试etimer
PROCESS_THREAD(hello_world_process2, ev, data)//进程1的功能体
{
//struct etimer timeout2; //声明ETMIER事件
PROCESS_BEGIN();//开始
。
。
。
乱,很乱!做为小白加新手,很容易被网上乱发的代码、错误的代码所误解。拜托这些所谓的大神们,网上言论是自由,但是别误人子弟好不好,
像我这样的新手入门不容易,发布验证过的代码例子也是一种美德!!
2019年07月20日 发现官方例子