基于stm32的虚拟多线程,可以很好的用于裸机程序中,用于模拟小型操作系统的多线程概念。本实例参考ti_ble协议栈_zstack协议栈。
#include “hal_led/hal_led.h”
#include “hal_delay/delay.h”
#include “hal_key/hal_key.h”
#include “ringbuffer.h”
#define app_led2_blink_event 0x0001
#define hal_led1_blink_event 0x0001
#define task_no_task_running 0xff
unsigned short hal_processevent( unsigned char task_id, unsigned short events );
unsigned short app_processevent( unsigned char task_id, unsigned short events );
typedef unsigned short uint16;
typedef unsigned char uint8;
#define task_cnt 2 //定义线程的个数
//定义函数指针
typedef unsigned short (*ptaskeventhandlerfn)( unsigned char task_id, unsigned short events );
//线程函数表
const ptaskeventhandlerfn tasksarr[] =
{
hal_processevent,
app_processevent
};
const unsigned char taskscnt = sizeof( tasksarr ) / sizeof( tasksarr[0] );
//uint16 *tasksevents;
uint16 tasksevents[task_cnt] = {0}; //每个线程有16位位域空间用于设置事件
static uint8 activetaskid = 0xff; //当前任务id,指示作用
#define success 0x00
#define failure 0x01
#define invalid_task 0x02
uint8 osal_set_event( uint8 task_id, uint16 event_flag )
{
if ( task_id 《 taskscnt )
{
tasksevents[task_id] |= event_flag; // stuff the event bit(s)
return ( success );
}
else
{
return ( invalid_task );
}
}
/**
* @brief 程序入口
* @param none
* @return none
*/
int main(void)
{
unsigned short taskid = 0;
uint8 idx = 0;
systeminit(); //系统时钟初始化
delayinit(72); //滴答定时器初始化
led_init(); //led初始化
nvic_prioritygroupconfig(nvic_prioritygroup_2);
osal_set_event(0, hal_led1_blink_event);
osal_set_event(1, app_led2_blink_event);
while(1)
{
do
{
if(tasksevents[idx]) //轮训获知哪个线程有事件需要进行处理
{
break;
}
}
while (++idx 《 taskscnt);
if (idx 《 taskscnt)
{
uint16 events;
events = tasksevents[idx];
tasksevents[idx] = 0; // 清除事件数组中的事件
activetaskid = idx;
events = (tasksarr[idx])( idx, events ); //调用线程函数
activetaskid = task_no_task_running;
tasksevents[idx] |= events; // 添加未处理的事件到本线程的事件组中
}
delayms(1000);
}
}
/**
* @brief 应用层处理
* @param none
* @r
*/
unsigned short hal_processevent( unsigned char task_id, unsigned short events )
{
if ( events & hal_led1_blink_event )
{
led_reverse(1);
return events ^ hal_led1_blink_event; //清除事件
}
}
/**
* @brief 硬件控制线程
* @param none
* @r
*/
unsigned short app_processevent( unsigned char task_id, unsigned short events )
{
if ( events & app_led2_blink_event )
{
led_reverse(2);
return events ^ app_led2_blink_event; //清除事件
智慧消防物联网云平台开发解决方案
波音太空客机试飞创造历史,一部分失败了
新西兰推迟5G频谱后直接分配3.5GHz频段频谱
我国光刻机技术处于一个什么水平,未来发展将会何如
拆解探讨丰田BEV电池系统
基于TI_BLE协议栈_ZStack协议栈解析
中国的移动支付业务发展成熟,正在走出国门向全球发展
如何排除DC-DC降压转换器故障?
应用在机房检测环境温湿度的多路数字温度传感芯片
大号铅笔造型LED台灯:电源线创作摆放更易激发灵感
食品加工厂饮食业机器工业化发展下 如何开展节能 降耗
物联网可以为企业带来哪些商业机会
智能家居大时代之下,智能家居魔镜大显身手
土壤水分传感器的显示方式有哪些
OPPO 50W超闪“饼干”充电器将在双十二正式发布
我国水利智慧化升级迎来契机,未来水利机器人将呈四大趋势发展
中国移动启动“5G+无人机+稻田机器人+大数据”智慧农业数据解决方案
人工智能如何改变客户和员工的体验
骁龙888版Galaxy S21+安兔兔跑分曝光?
既有12亿罚单又有20亿采购温暖,中国手机半壁江山战队高通