STM32 简单多任务调度
(2012-09-17 22:13:12)
标签:
it |
分类: 摘抄 |
- int
main( void) - {
-
while(1) -
{ -
//Task1(); 调用任务1 -
//Task2(); 调用任务2 -
} - }
int main(void)
{
while (1)
{
Task1(); // 调用任务1
Task2(); // 调用任务2
}
}
- typedef
struct{ -
void(*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) - {
-
//任务循环 -
for(i = 0; i < ARRAYSIZE(mTaskTab); i++) -
{ -
if(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{ -
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) -
{
-
inti = 0; -
//硬件初始化 -
HW_init(); -
//初始化系统Tick任务 -
void);dev_SysTick_init( -
//... -
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{
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) -
{
-
returng_TimingTick; -
}
-
- //=================================================================================================
- //【函
数 名 称】 void Task_SysTick(void) - //【参
数】 - //【功
能】 Tick任务,从TIM2获取系统时间 - //【返
回 值】 None - //【创
建 者】 2010-07-27 firehood - //=================================================================================================
- void
Task_SysTick( void) -
{
-
int16u temp = TIM_GetCounter(TIM2); -
-
if(temp > 1000) -
{ -
TIM_SetCounter(TIM2, 0); -
g_TimingTickOld = g_TimingTickOld + temp; -
temp = 0; -
} -
g_TimingTick = g_TimingTickOld + temp; -
}

加载中…