STM32下使用Keil自带的RTL
Keil ARTX(Advanced Real-Time eXecutive)是Keil为ARM 系列所提供的一个小型实时操作系统,整合于其UV3开发环境之中.在下载并安装了RealView MDK个人学习版后,ARTX同时安装到了C:KeilARMRLRTX目录下,在C:KeilARMBoardsKeilMCBSTM32STLIB_RTX_Blinky目录下有STM32的例子程序。经过简单修改,运行在万利开发板上。
#include
#include
OS_TID t_phaseA; //分配任务ID号
OS_TID t_phaseB;
OS_TID t_phaseC;
OS_TID t_phaseD;
#define LED_A GPIO_Pin_4
#define LED_B GPIO_Pin_5
#define LED_C GPIO_Pin_6
#define LED_D GPIO_Pin_7
#define LED_On(led) GPIO_SetBits(GPIOC, led)
#define LED_Off(led) GPIO_ResetBits(GPIOC, led)
extern void SetupClock (void);
extern void SetupLED (void);
void phaseA (void) __task {
for (;;) {
LED_On (LED_A);
os_dly_wait (100);
LED_Off(LED_A);
os_dly_wait (100);
}
}
void phaseB (void) __task {
for (;;) {
LED_On (LED_B);
os_dly_wait (100);
LED_Off(LED_B);
os_dly_wait (100);
}
}
void phaseC (void) __task {
for (;;) {
LED_On (LED_C);
os_dly_wait (100);
LED_Off(LED_C);
os_dly_wait (100);
}
}
void phaseD (void) __task {
for (;;) {
LED_On (LED_D);
os_dly_wait (100);
LED_Off(LED_D);
os_dly_wait (100);
}
}
void init (void) __task {
t_phaseA = os_tsk_create (phaseA, 0);
os_dly_wait (50);
t_phaseB = os_tsk_create (phaseB, 0);
os_dly_wait (50);
t_phaseC = os_tsk_create (phaseC, 0);
os_dly_wait (50);
t_phaseD = os_tsk_create (phaseD, 0);
os_tsk_delete_self ();
}
int main (void) {
SetupClock();
SetupLED ();
os_sys_init (init);
}
经过初试化后,os_sys_init (init)启动了初试化任务。在初试化任务中,又先后启动了4个任务,启动后,
删除初试化任务。这4个任务各自控制一个LED的开关。
============================================
个人理解:
int main(void)
{
}
问1:为什么在TaskMain里面创建很多小任务不在下面继续调用os_sys_init_user( ); 这个API呢?原因是因为初始化TaskMain之后不再返回了,所以他也执行不到下面while
问2:TaskMain 里面创建的小任务,而小任务里面也都是有while(1)死循环,这就是多线程的概念。除了while(1)其他也都是只执行一次,包括主函数和小任务里面的变量,只有while(1)是时间片和优先级运行,实现多线程执行。
STM32KeilRT 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)