|
楼主 |
发表于 2015-12-30 16:40:43
|
显示全部楼层
13.4 实验例程说明(中断方式通信)
13.4.1 STM32F103开发板实验
配套例子:
V4-410_RTX实验_事件标志组(中断方式)
实验目的:
1. 学习RTX的事件标志组(中断方式)
实验内容:
1. K1按键按下,串口打印。
2. K2键按下,启动单次定时器中断,50ms后在定时器中断给任务AppTaskMsgPro发送事件标志,设置bit0。
3. K3键按下,启动单次定时器中断,50ms后在定时器中断给任务AppTaskMsgPro发送事件标志,设置bit1。
4. 任务AppTaskMsgPro只有接收到bit0和bit1都被设置了才执行串口打印信息。
5. 各个任务实现的功能如下:
AppTaskUserIF任务 :按键消息处理。
AppTaskLED任务 :LED闪烁。
AppTaskMsgPro任务 :消息处理,等待定时器中断发来的事件标志。
AppTaskStart任务 :启动任务,也是最高优先级任务,这里实现按键扫描。
RTX配置:
RTX配置向导详情如下:
u Task Configuration
l Number of concurrent running tasks
允许创建4个任务,实际创建了如下四个任务
AppTaskUserIF任务 :按键消息处理。
AppTaskLED任务 :LED闪烁。
AppTaskMsgPro任务 :消息处理,等待定时器中断发来的事件标志。
AppTaskStart任务 :启动任务,也是最高优先级任务,这里实现按键扫描。
l Number of tasks with user-provided stack
创建的4个任务都是采用自定义堆栈方式。
RTX任务调试信息:
u Event Value:任务AppTaskMsgPro当前的事件标志数值。
u Event Mask:任务AppTaskMsgPro等待的事件标志数值。
程序设计:
u 任务栈大小分配:
staticuint64_t AppTaskUserIFStk[512/8]; /* 任务栈 */
staticuint64_t AppTaskLEDStk[256/8]; /* 任务栈 */
staticuint64_t AppTaskMsgProStk[512/8]; /* 任务栈 */
staticuint64_t AppTaskStartStk[512/8]; /* 任务栈 */
将任务栈定义成uint64_t类型可以保证任务栈是8字节对齐的,8字节对齐的含义就是数组的首地址对8求余等于0。如果不做8字节对齐的话,部分C语言库函数,浮点运算和uint64_t类型数据运算会出问题。
u 系统栈大小分配:
u RTX初始化:
- /*
- *********************************************************************************************************
- * 函 数 名: main
- * 功能说明: 标准c程序入口。
- * 形 参: 无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- int main (void)
- {
- /* 初始化外设 */
- bsp_Init();
-
- /* 创建启动任务 */
- os_sys_init_user (AppTaskStart, /* 任务函数 */
- 4, /* 任务优先级 */
- &AppTaskStartStk, /* 任务栈 */
- sizeof(AppTaskStartStk)); /* 任务栈大小,单位字节数 */
- while(1);
- }
复制代码 u RTX任务创建:
- /*
- *********************************************************************************************************
- * 函 数 名: AppTaskCreate
- * 功能说明: 创建应用任务
- * 形 参: 无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- static void AppTaskCreate (void)
- {
- HandleTaskUserIF = os_tsk_create_user(AppTaskUserIF, /* 任务函数 */
- 1, /* 任务优先级 */
- &AppTaskUserIFStk, /* 任务栈 */
- sizeof(AppTaskUserIFStk)); /* 任务栈大小,单位字节数 */
-
- HandleTaskLED = os_tsk_create_user(AppTaskLED, /* 任务函数 */
- 2, /* 任务优先级 */
- &AppTaskLEDStk, /* 任务栈 */
- sizeof(AppTaskLEDStk)); /* 任务栈大小,单位字节数 */
-
- HandleTaskMsgPro = os_tsk_create_user(AppTaskMsgPro, /* 任务函数 */
- 3, /* 任务优先级 */
- &AppTaskMsgProStk, /* 任务栈 */
- sizeof(AppTaskMsgProStk)); /* 任务栈大小,单位字节数 */
- }
复制代码 u 四个RTX任务的实现:
u 定时器中断回调函数中发送事件标志:
定时器中断的初始化和中断函数在bsp_timer.c文件中实现,这个不是教程的重点,故不作介绍。这里主要关心RTX的事件标志函数在中断服务程序中的使用方法。
- /*
- *********************************************************************************************************
- * 函 数 名: TIM_CallBack1
- * 功能说明: 定时器中断的回调函数,此函数被bsp_StartHardTimer所调用。
- * 形 参: 无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- static void TIM_CallBack1(void)
- {
- /* 发送事件标志,设置bit0 */
- isr_evt_set (BIT_0, HandleTaskMsgPro);
- }
-
- static void TIM_CallBack2(void)
- {
- /* 发送事件标志,设置bit1 */
- isr_evt_set (BIT_1, HandleTaskMsgPro);
- }
复制代码 13.4.2 STM32F407开发板实验
配套例子:
V5-410_RTX实验_事件标志组(中断方式)
实验目的:
1. 学习RTX的事件标志组(中断方式)
实验内容:
1. K1按键按下,串口打印。
2. K2键按下,启动单次定时器中断,50ms后在定时器中断给任务AppTaskMsgPro发送事件标志,设置bit0。
3. K3键按下,启动单次定时器中断,50ms后在定时器中断给任务AppTaskMsgPro发送事件标志,设置bit1。
4. 任务AppTaskMsgPro只有接收到bit0和bit1都被设置了才执行串口打印信息。
5. 各个任务实现的功能如下:
AppTaskUserIF任务 :按键消息处理。
AppTaskLED任务 :LED闪烁。
AppTaskMsgPro任务 :消息处理,等待定时器中断发来的事件标志。
AppTaskStart任务 :启动任务,也是最高优先级任务,这里实现按键扫描。
RTX配置:
RTX配置向导详情如下:
u Task Configuration
l Number of concurrent running tasks
允许创建4个任务,实际创建了如下四个任务
AppTaskUserIF任务 :按键消息处理。
AppTaskLED任务 :LED闪烁。
AppTaskMsgPro任务 :消息处理,等待定时器中断发来的事件标志。
AppTaskStart任务 :启动任务,也是最高优先级任务,这里实现按键扫描。
l Number of tasks with user-provided stack
创建的4个任务都是采用自定义堆栈方式。
RTX任务调试信息:
u Event Value:任务AppTaskMsgPro当前的事件标志数值。
u Event Mask:任务AppTaskMsgPro等待的事件标志数值。
程序设计:
u 任务栈大小分配:
staticuint64_t AppTaskUserIFStk[512/8]; /* 任务栈 */
staticuint64_t AppTaskLEDStk[256/8]; /* 任务栈 */
staticuint64_t AppTaskMsgProStk[512/8]; /* 任务栈 */
staticuint64_t AppTaskStartStk[512/8]; /* 任务栈 */
将任务栈定义成uint64_t类型可以保证任务栈是8字节对齐的,8字节对齐的含义就是数组的首地址对8求余等于0。如果不做8字节对齐的话,部分C语言库函数,浮点运算和uint64_t类型数据运算会出问题。
u 系统栈大小分配:
u RTX初始化:
- /*
- *********************************************************************************************************
- * 函 数 名: main
- * 功能说明: 标准c程序入口。
- * 形 参: 无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- int main (void)
- {
- /* 初始化外设 */
- bsp_Init();
-
- /* 创建启动任务 */
- os_sys_init_user (AppTaskStart, /* 任务函数 */
- 4, /* 任务优先级 */
- &AppTaskStartStk, /* 任务栈 */
- sizeof(AppTaskStartStk)); /* 任务栈大小,单位字节数 */
- while(1);
- }
复制代码 u RTX任务创建:
- /*
- *********************************************************************************************************
- * 函 数 名: AppTaskCreate
- * 功能说明: 创建应用任务
- * 形 参: 无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- static void AppTaskCreate (void)
- {
- HandleTaskUserIF = os_tsk_create_user(AppTaskUserIF, /* 任务函数 */
- 1, /* 任务优先级 */
- &AppTaskUserIFStk, /* 任务栈 */
- sizeof(AppTaskUserIFStk)); /* 任务栈大小,单位字节数 */
-
- HandleTaskLED = os_tsk_create_user(AppTaskLED, /* 任务函数 */
- 2, /* 任务优先级 */
- &AppTaskLEDStk, /* 任务栈 */
- sizeof(AppTaskLEDStk)); /* 任务栈大小,单位字节数 */
-
- HandleTaskMsgPro = os_tsk_create_user(AppTaskMsgPro, /* 任务函数 */
- 3, /* 任务优先级 */
- &AppTaskMsgProStk, /* 任务栈 */
- sizeof(AppTaskMsgProStk)); /* 任务栈大小,单位字节数 */
- }
复制代码 u 四个RTX任务的实现:
u 定时器中断回调函数中发送事件标志:
定时器中断的初始化和中断函数在bsp_timer.c文件中实现,这个不是教程的重点,故不作介绍。这里主要关心RTX的事件标志函数在中断服务程序中的使用方法。
- /*
- *********************************************************************************************************
- * 函 数 名: TIM_CallBack1
- * 功能说明: 定时器中断的回调函数,此函数被bsp_StartHardTimer所调用。
- * 形 参: 无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- static void TIM_CallBack1(void)
- {
- /* 发送事件标志,设置bit0 */
- isr_evt_set (BIT_0, HandleTaskMsgPro);
- }
-
- static void TIM_CallBack2(void)
- {
- /* 发送事件标志,设置bit1 */
- isr_evt_set (BIT_1, HandleTaskMsgPro);
- }
复制代码 |
|