[首发]RT-thread+STM32F407+蜂鸣器+LED,时间片轮循调度测试
小李第一次博客分享,请多指教
此次试验是自己手动移植rt-thread操作系统,并编写两个外设文件,使其采用优先级调度以及时间片轮转方式运行。代码效果为,LED每隔1600ms完成一次闪烁,即亮800ms灭800ms,蜂鸣器,周期1000ms,鸣叫占空比50%,鸣叫3声,利用延时切换任务执行,达到“同时执行”的假象。
移植步骤
使用ENV工具,安装rt-therad 软件支持包。
- ENV学习参考 ,https://www.bilibili.com/video/BV1NJ411b7d1?p=1
- rt-thread 蜂鸣器官方软件包参考手册 http://packages.rt-thread.org/detail.html?package=beep
步骤:1、首先安装好ENV工具。
2、获取 rt-thread 源码,进入下图路径 右击选择ENV。
3、进入此界面后输入指令,安装软件包 使用 menuconfig 指令 更新软件包pkgs --update ,编译工程 scons,最后使用指令重新生成MD5文件scons --target=mdk5
自此工程配置就完成了。下面开始进行软件代码编写
代码部分(部分代码)
主函数
extern void led_text(void); //声明此函数在外部定义
int main(void)
{
beep_init(GET_PIN(F,8),PIN_LOW); //定义蜂鸣器接口PF8,,默认为低电平
while (1)
{
led_text(); //LED进程创建函数
rt_thread_delay(1); //引发任务调度延时函数
beep(4,100,50,0); ///* 鸣叫3声,周期1000ms,鸣叫占空比50%,默认发声频率 */
}
}
/***********************LED进程初始化部分************************/
static void led_entry(void *param)
{
rt_pin_mode(89,PIN_MODE_OUTPUT); //89号引脚对应PE8。IO口
while(1)
{
rt_pin_write( 89,PIN_LOW); //800msled闪烁一次
rt_thread_delay(800);
rt_pin_write( 89,PIN_HIGH);
rt_thread_delay(800);
}
}
void led_text(void)
{
rt_thread_t tid; //创建指针指向任务控制块TCB
tid = rt_thread_create("led", //动态创建线程,任务优先级和时间片都为10
led_entry, RT_NULL,
170,
10,
10);
if (tid != RT_NULL)
rt_thread_startup(tid); //若创建成功,则使任务筋肉就绪队列,等待调度器运行
}
/***********************BEEP进程部分************************/
/***************************************************************************************************
* @fn beep_init
*
* @brief 初始化
*
* @param pin - 蜂鸣器驱动引脚,可查看drv_gpio.c,或使用GET_PIN()宏
* reset_level - 蜂鸣器关断时引脚电平,PIN_LOW或PIN_HIGH
*
***************************************************************************************************/
void beep_init(rt_base_t pin, rt_base_t reset_level)
{
#ifdef PKG_BEEP_PASSIVE_BUZZER
(void)pin;
(void)reset_level;
beep_data.pwm_dev = (struct rt_device_pwm *)rt_device_find(PKG_BEEP_PWM_DEV_NAME);
RT_ASSERT(beep_data.pwm_dev);
beep_data.freq = PKG_BEEP_DEFAULT_FREQ;
#ifdef PKG_BEEP_SUPPORT_PM_RUN_FREQ_CHANGE
rt_pm_device_register(&beep_data.pwm_dev->parent, &beep_pm_ops);
#endif /* PKG_BEEP_SUPPORT_PM_RUN_FREQ_CHANGE */
beep_set();
#else /* PKG_BEEP_ACTIVE_BUZZER */
rt_pin_write(pin, reset_level);
rt_pin_mode(pin, PIN_MODE_OUTPUT);
beep_data.pin = pin;
beep_data.pin_reset_level = reset_level;
#endif /* PKG_BEEP_PASSIVE_BUZZER */
beep_data.inited = RT_TRUE;
}