现在一般做网站用什么技术,甘肃省最新出行通告,微小店和微商城区别,网站图片怎么做超链接1、前言 正常STM32实现多线程#xff0c;需要移植一个操作系统FreeRTOS。但是在这里不移植FreeRTOS怎么实现多线程呢#xff1f;使用SysTick#xff0c;那么怎么使用SysTick来模拟多线程呢#xff1f;前面我们知道SysTick就是一个定时器#xff0c;它不是在主函数的while循…1、前言 正常STM32实现多线程需要移植一个操作系统FreeRTOS。但是在这里不移植FreeRTOS怎么实现多线程呢使用SysTick那么怎么使用SysTick来模拟多线程呢前面我们知道SysTick就是一个定时器它不是在主函数的while循环里实现的就是在旁边自己玩自己的。所以我们可以理解成main函数是主线程而SysTick在一边实现自己的在SysTick里面。可以通过配置让SysTick每一秒钟中断一次在中断服务函数里面干其他的事情这样就实现了多线程。
2、动手实现双线程
使用项目文件11-带操作系统的延时函数复制重命名为12-SysTick模拟多线程流水灯
打开文件找到SysTick_Handler函数
在.s文件只有一个.s文件中找到SysTick_Handler ctrlf查找文件 在主函数的HAL_Init();函数中 可以看到HAL_IncTick();函数设置了一个1ms的中断所以我们不需要配置额外的配置了只需要在中断服务函数中做自己想要做的事就可以了。 现在在主函数中在流水灯中是每隔500ms换一次led1和led2的闪烁情况现在我们换一下让led1每隔1000ms闪烁一次led2每隔500ms闪烁一次主函数实现led2的闪烁情况SysTick实现led1的闪烁情况。
主函数情况如下 这里的定义和头文件都是为了方便才放到这里的
这样就实现了上述描述的实验
还可以都在HAL_IncTick();函数中实现先把主函数中的实现给注释掉具体代码如下 3、遇到多线程
遇到很多条线程的时候我们不可能每一条都那么写会显得很冗余
在该目录文件下新建文件夹tasks,和相应的.c .h文件 用来存放所有的线程将文件加载进工程文件中
在.c文件中引入#include tasks.h
编译搞出.h文件打开.h文件 编译-下载运行结果一致
但是没有完接着做进一步的改装 这是一个中断服务函数现在只是点亮led灯不算复杂未来我们要使用SysTick的时候不可以在这里很复杂的事情不可以在这里延时很久的时间。 让sysTick_isr();函数只起到一个计数的功能并不在这个函数里面延时现在点灯操作还没有实现延迟定义两个flag用来标志是否达到指定的数目如果达到就在另一个线程函数中实现点灯未来实现延迟功能。
代码如下
tasks.c
#include tasks.h
#include led.huint32_t task1_cnt 0; //定义一个变量用来计数
uint32_t task2_cnt 0; //定义一个变量用来计数
uint8_t task1_flag 0;
uint8_t task2_flag 0;void sysTick_isr(void)
{if(task1_cnt 1000)task1_cnt;else{task1_flag 1;task1_cnt 0;}if(task2_cnt 500)task2_cnt;else{task2_flag 1;task2_cnt 0;}}
void task1(void)
{if(task1_flag 0)return;task1_flag 0;//置位led1_toggle();}
void task2(void)
{if(task2_flag 0)return;task2_flag 0;led2_toggle();}tasks.h
#ifndef __TASKS_H__
#define __TASKS_H__#include sys.hvoid sysTick_isr(void);
void task1(void);
void task2(void);#endif
main.c
#include sys.h
#include delay.h
#include led.h
#include tasks.hint main(void)
{HAL_Init(); /* 初始化HAL库 */stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */led_init(); /* 初始化LED灯 */while(1){//一直在while循环中不断的重复执行task()函数//task()函数只有在满足对应条件的时候才会点灯否则不点灯白执行task1();task2();}
}
代码分析
主函数不断在while中调用task1(); 和task2();函数当task1(); 和task2();函数中标志位满足相应的条件就会执行点灯操作否则不满足不执行直接return返回对于标志位的操作是看是否满足其数量如果到指定数目则标志位为1否则依旧为0。