STM32 简单多任务调度
(2012-09-17 22:13:12)
标签:
it |
分类: 摘抄 |
- int
main( void) - {
-
(1) -
{ -
Task1(); 调用任务1 -
Task2(); 调用任务2 -
} - }
int main(void) { while (1) { Task1(); // 调用任务1 Task2(); // 调用任务2 } }
- typedef
struct{ -
(*fTask)( void); -
int64u uNextTick; -
int32u uLenTick; -
}sTask;
typedef struct{ void (*fTask)(void); int64u uNextTick; int32u uLenTick; }sTask;
- //
任务列表 - static
sTask mTaskTab[] = -
{
-
{Task_SysTick, 0, 0} -
,{Task1, 0, 10} 10ms执行一次 -
,{Task2, 0, 200} 200ms执行一次 -
};
// 任务列表 static sTask mTaskTab[] = { {Task_SysTick, 0, 0} ,{Task1, 0, 10} // 10ms执行一次 ,{Task2, 0, 200} // 200ms执行一次 };
- while
(1) - {
-
任务循环 -
(i = 0; i < ARRAYSIZE(mTaskTab); i++) -
{ -
(mTaskTab[i].uNextTick <= GetTimingTick()) -
{ -
mTaskTab[i].uNextTick += mTaskTab[i].uLenTick; -
mTaskTab[i].fTask(); -
} -
} -
}
while (1) { // 任务循环 for (i = 0; i < ARRAYSIZE(mTaskTab); i++) { if (mTaskTab[i].uNextTick <= GetTimingTick()) { mTaskTab[i].uNextTick += mTaskTab[i].uLenTick; mTaskTab[i].fTask(); } } }
附:
- #ifndef
ARRAYSIZE - #define
ARRAYSIZE(a) (sizeof(a) / sizeof((a)[0])) - #endif
-
- //
任务结构 - typedef
struct{ -
(*fTask)( void); -
u64 uNextTick; -
u32 uLenTick; - }sTask;
-
-
- //
任务列表 - static
sTask mTaskTab[] = -
{
-
{Task_SysTick, 0, 0} -
,{Task1, 0, 10} 10ms执行一次 -
,{Task2, 0, 200} 200ms执行一次 -
-
在这之前添加任务 -
};
-
-
- int
main( void) -
{
-
i = 0; -
硬件初始化 -
HW_init(); -
初始化系统Tick任务 -
dev_SysTick_init( -
... -
(1) -
{ -
任务循环 -
(i = 0; i < ARRAYSIZE(mTaskTab); i++) -
{ -
(mTaskTab[i].uNextTick <= GetTimingTick()) -
{ -
mTaskTab[i].uNextTick += mTaskTab[i].uLenTick; -
mTaskTab[i].fTask(); -
} -
} -
}
#ifndef ARRAYSIZE #define ARRAYSIZE(a) (sizeof(a) / sizeof((a)[0])) #endif // 任务结构 typedef struct{ void (*fTask)(void); u64 uNextTick; u32 uLenTick; }sTask; // 任务列表 static sTask mTaskTab[] = { {Task_SysTick, 0, 0} ,{Task1, 0, 10} // 10ms执行一次 ,{Task2, 0, 200} // 200ms执行一次 // 在这之前添加任务 }; int main(void) { int i = 0; // 硬件初始化 HW_init(); // 初始化系统Tick任务 dev_SysTick_init(void); // ... while (1) { // 任务循环 for (i = 0; i < ARRAYSIZE(mTaskTab); i++) { if (mTaskTab[i].uNextTick <= GetTimingTick()) { mTaskTab[i].uNextTick += mTaskTab[i].uLenTick; mTaskTab[i].fTask(); } } }}
Task_SysTick任务相关代码:
- volatile
int64u g_TimingTick = 0; - volatile
int64u g_TimingTickOld = 0; -
- //=================================================================================================
- //【函
数 名 称】 void dev_SysTick_init(void) - //【参
数】 - //【功
能】 初始化 - //【返
回 值】 None - //【创
建 者】 2010-07-27 firehood - //=================================================================================================
- void
dev_SysTick_init( void) - {
-
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; -
-
-
TIM_TimeBaseStructure.TIM_Period = 65535; -
TIM_TimeBaseStructure.TIM_Prescaler = 36000-1; -
TIM_TimeBaseStructure.TIM_ClockDivision = 0; -
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; -
-
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); -
-
TIM_SetCounter(TIM2, 0); -
-
-
TIM_Cmd(TIM2, ENABLE); -
}
-
- //=================================================================================================
- //【函
数 名 称】 void GetTimingTick(void) - //【参
数】 - //【功
能】 获取MCU启动后的运行时间 - //【返
回 值】 MCU启动后的运行时间,单位ms - //【创
建 者】 2010-07-27 firehood - //=================================================================================================
- int64u
GetTimingTick( void) -
{
-
g_TimingTick; -
}
-
- //=================================================================================================
- //【函
数 名 称】 void Task_SysTick(void) - //【参
数】 - //【功
能】 Tick任务,从TIM2获取系统时间 - //【返
回 值】 None - //【创
建 者】 2010-07-27 firehood - //=================================================================================================
- void
Task_SysTick( void) -
{
-
int16u temp = TIM_GetCounter(TIM2); -
-
(temp > 1000) -
{ -
TIM_SetCounter(TIM2, 0); -
g_TimingTickOld = g_TimingTickOld + temp; -
temp = 0; -
} -
g_TimingTick = g_TimingTickOld + temp; -
}