4.22参加了开放原子训练营(第三季)RT-Thread Nano 学习营,会上主持人详细介绍了RT-Thread Nano实时操作系统。RT-Thread Nano是RT-Thread的极简版,包括了最小的核心组件,因此它移植非常容易,仅需添加源码到工程就可以完成90%的移植工作。最重要的是,它开源免费并提供了极具人性化的参考文档,对于学习内核基础、线程管理、时钟管理、线程间同步、线程间通信、内存管理、中断管理,以及 Nano 版块移植都有良好的帮助。
在会上额外介绍了摩斯电码morse软件包的使用。下列代码为morse的核心实现,
morse_timer = rt_timer_create("morse", morse_timeout,
RT_NULL, 0,
RT_TIMER_FLAG_ONE_SHOT);
通过创建定时器,定时检测按键按下时间及松手时间,判断输入信号为“di”还是“da”。具体地,通过PKG_USING_MORSE_DI_DA_SEPARATE该宏控制判断“di”或者“da”的时间长短,如果按键时长小于该宏设定时长,则认为发送数据“di”,否则发送“da”,如下
void morse_input(rt_bool_t flag)
{
if (morse_flag != flag)
{
rt_tick_t interval = rt_tick_get_millisecond() - millisecond;
millisecond = rt_tick_get_millisecond();
if (flag)
{
rt_timer_stop(morse_timer);led_flag=0;
}
else
{
if (interval <= PKG_USING_MORSE_DI_DA_SEPARATE)
{
dida_add(RT_DI);led_flag=1;
}
else
{
dida_add(RT_DA);led_flag=2;
}
morse_timer_start(PKG_USING_MORSE_INTERCHAR);
}
morse_flag = flag;
}
}
最后,通过外部中断检测按键的上升沿及下降沿,依此使用morse_input函数判断输入数据类型,超时时间由PKG_USING_MORSE_INTERCHAR该宏给定。经过会上实验,这部分功能非常有趣,可以进一步添加按键亮灯功能,如下。在中断函数内部读取按键电平,实现按键按下时低电平,led灯亮,松开按键时高电平,led灯灭。
#define USER_KEY GET_PIN(C, 13) // GET_PIN(H,4)
#define LED0_PIN GET_PIN(A,5)
void irq_callback()
{
morse_input(!rt_pin_read(USER_KEY));
if(rt_pin_read(USER_KEY))
{
rt_pin_write(LED0_PIN, PIN_LOW);
}
else {
rt_pin_write(LED0_PIN, PIN_HIGH);
}
}
通过这次实训学习,使我对RT-Thread的基本知识和理论有了比较系统而全面的理解,使我在嵌入式上有了更深层次的提高。