根据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; //铲除事情