|
楼主 |
发表于 2016-1-8 15:49:10
|
显示全部楼层
20.2 实验例程说明
20.2.1 STM32F103开发板实验
配套例子:
V4-420_RTX实验_独立看门狗监测任务的执行状态
实验目的:
1. 学习独立看门狗监测任务的执行状态
实验内容:
1.K1按键按下,串口打印。
2.看门狗监测任务执行状态说明:
(1). 设置看门狗复位时间是10s,如果10s内不喂狗系统复位。
(2). 使用事件标志组,在最高优先级任务中等待其它所有用户任务发来的事件标志,如果所有任务都发来了事件标志,那么就执行喂狗程序,如果有一个任务10s内没有发来事件标志,那么系统会被复位。
(3). 简单的说就是为了检测任务的执行转态,我们设置每个任务10s内必须发一次事件标志以此来表示任务在执行。如果10s内有一个任务没有发来消息,系统会被复位。
(4). 等待事件标志的任务:
xResult= os_evt_wait_and (TASK_BIT_ALL, usMaxBlockTime);
其它四个发送事件标志的任务:
os_evt_set(TASK_BIT_0, HandleTaskStart);
os_evt_set(TASK_BIT_1, HandleTaskStart);
os_evt_set(TASK_BIT_2, HandleTaskStart);
os_evt_set(TASK_BIT_3, HandleTaskStart);
3.K2按键按下后将任务AppTaskTaskUserIF延迟20s后执行,从而实现看门狗复位。
4.各个任务实现的功能如下:
AppTaskUserIF任务 :按键消息处理。
AppTaskLED任务 :LED闪烁。
AppTaskMsgPro任务 :消息处理,这里用作LED闪烁。
AppTaskScan任务 :按键扫描。
AppTaskStart任务 :启动任务,也是最高优先级任务,等待其它任务发送来的事件标志。
RTX配置:
RTX配置向导详情如下:
u Task Configuration
l Number of concurrent running tasks
允许创建5个任务,实际创建了如下5个任务:
AppTaskUserIF任务 :按键消息处理。
AppTaskLED任务 :LED闪烁。
AppTaskMsgPro任务 :消息处理,这里用作LED闪烁。
AppTaskScan任务 :按键扫描。
AppTaskStart任务 :启动任务,也是最高优先级任务,等待其它任务发送来的事件标志。
l Number of tasks with user-provided stack
创建的5个任务都是采用自定义堆栈方式。
RTX任务调试信息:
程序设计:
u 任务栈大小分配:
staticuint64_t AppTaskUserIFStk[512/8]; /* 任务栈 */
staticuint64_t AppTaskLEDStk[256/8]; /* 任务栈 */
staticuint64_t AppTaskMsgProStk[512/8]; /* 任务栈 */
staticuint64_t AppTaskScanStk[1024/8]; /* 任务栈 */
staticuint64_t AppTaskStartStk[1024/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, /* 任务函数 */
- 5, /* 任务优先级 */
- &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)); /* 任务栈大小,单位字节数 */
-
- HandleTaskScan = os_tsk_create_user(AppTaskScan, /* 任务函数 */
- 4, /* 任务优先级 */
- &AppTaskScanStk, /* 任务栈 */
- sizeof(AppTaskScanStk)); /* 任务栈大小,单位字节数 */
- }
复制代码 u STM32F103独立看门狗驱动:
- /*
- *********************************************************************************************************
- * 函 数 名: bsp_InitIwdg
- * 功能说明: 独立看门狗时间配置函数
- * 形 参:IWDGTime: 0 - 0x0FFF,设置的是128分频,LSI的时钟频率按40KHz计算。
- * 128分频的情况下,最小3.2ms,最大13107.2ms。
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void bsp_InitIwdg(uint32_t _ulIWDGTime)
- {
-
- /* 检测系统是否从独立看门狗复位中恢复 */
- if (RCC_GetFlagStatus(RCC_FLAG_IWDGRST) != RESET)
- {
- /* 清除复位标志 */
- RCC_ClearFlag();
- }
-
- /* 使能LSI */
- RCC_LSICmd(ENABLE);
-
- /* 等待直到LSI就绪 */
- while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET);
-
- /* 写入0x5555表示允许访问IWDG_PR 和IWDG_RLR寄存器 */
- IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
-
- /* LSI/32 分频*/
- IWDG_SetPrescaler(IWDG_Prescaler_128);
-
- IWDG_SetReload(_ulIWDGTime);
-
- /* 重载IWDG计数 */
- IWDG_ReloadCounter();
-
- /* 使能 IWDG (LSI oscillator 由硬件使能) */
- IWDG_Enable();
- }
-
- /*
- *********************************************************************************************************
- * 函 数 名: IWDG_Feed
- * 功能说明: 喂狗函数
- * 形 参:无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void IWDG_Feed(void)
- {
- IWDG_ReloadCounter();
- }
复制代码 u 五个RTX任务的实现:
20.2.2 STM32F407开发板实验
配套例子:
V5-420_RTX实验_独立看门狗监测任务的执行状态
实验目的:
1. 学习独立看门狗监测任务的执行状态
实验内容:
1.K1按键按下,串口打印。
2.看门狗监测任务执行状态说明:
(1). 设置看门狗复位时间是10s,如果10s内不喂狗系统复位。
(2). 使用事件标志组,在最高优先级任务中等待其它所有用户任务发来的事件标志,如果所有任务都发来了事件标志,那么就执行喂狗程序,如果有一个任务10s内没有发来事件标志,那么系统会被复位。
(3). 简单的说就是为了检测任务的执行转态,我们设置每个任务10s内必须发一次事件标志以此来表示任务在执行。如果10s内有一个任务没有发来消息,系统会被复位。
(4). 等待事件标志的任务:
xResult= os_evt_wait_and (TASK_BIT_ALL, usMaxBlockTime);
其它四个发送事件标志的任务:
os_evt_set(TASK_BIT_0, HandleTaskStart);
os_evt_set(TASK_BIT_1, HandleTaskStart);
os_evt_set(TASK_BIT_2, HandleTaskStart);
os_evt_set(TASK_BIT_3, HandleTaskStart);
3.K2按键按下后将任务AppTaskTaskUserIF延迟20s后执行,从而实现看门狗复位。
4.各个任务实现的功能如下:
AppTaskUserIF任务 :按键消息处理。
AppTaskLED任务 :LED闪烁。
AppTaskMsgPro任务 :消息处理,这里用作LED闪烁。
AppTaskScan任务 :按键扫描。
AppTaskStart任务 :启动任务,也是最高优先级任务,等待其它任务发送来的事件标志。
RTX配置:
RTX配置向导详情如下:
u Task Configuration
l Number of concurrent running tasks
允许创建5个任务,实际创建了如下5个任务:
AppTaskUserIF任务 :按键消息处理。
AppTaskLED任务 :LED闪烁。
AppTaskMsgPro任务 :消息处理,这里用作LED闪烁。
AppTaskScan任务 :按键扫描。
AppTaskStart任务 :启动任务,也是最高优先级任务,等待其它任务发送来的事件标志。
l Number of tasks with user-provided stack
创建的5个任务都是采用自定义堆栈方式。
RTX任务调试信息:
程序设计:
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, /* 任务函数 */
- 5, /* 任务优先级 */
- &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)); /* 任务栈大小,单位字节数 */
-
- HandleTaskScan = os_tsk_create_user(AppTaskScan, /* 任务函数 */
- 4, /* 任务优先级 */
- &AppTaskScanStk, /* 任务栈 */
- sizeof(AppTaskScanStk)); /* 任务栈大小,单位字节数 */
- }
复制代码 u STM32F407独立看门狗驱动:
- /*
- *********************************************************************************************************
- * 函 数 名: bsp_InitIwdg
- * 功能说明: 独立看门狗时间配置函数
- * 形 参:IWDGTime: 0 - 0x0FFF,设置的是32分频,LSI的时钟频率按32KHz计算。
- * 32分频的情况下,最小1ms,最大4095ms。
- * ----------------------
- * 这里没有结合TIM5测得实际LSI频率,LSI = 34000左右
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void bsp_InitIwdg(uint32_t _ulIWDGTime)
- {
-
- /* 检测系统是否从独立看门狗复位中恢复 */
- if (RCC_GetFlagStatus(RCC_FLAG_IWDGRST) != RESET)
- {
- /* 清除复位标志 */
- RCC_ClearFlag();
- }
- else
- {
- /* 标志没有设置 */
- }
-
- /* 使能LSI */
- RCC_LSICmd(ENABLE);
-
- /* 等待直到LSI就绪 */
- while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET)
- {}
-
-
- /* 写入0x5555表示允许访问IWDG_PR 和IWDG_RLR寄存器 */
- IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
-
- /* LSI/32 分频*/
- IWDG_SetPrescaler(IWDG_Prescaler_32);
-
- /*特别注意,由于这里_ulIWDGTime的最小单位是ms, 所以这里重装计数的
- 计数时 需要除以1000
- Counter Reload Value = (_ulIWDGTime / 1000) /(1 / IWDG counter clock period)
- = (_ulIWDGTime / 1000) / (32/LSI)
- = (_ulIWDGTime / 1000) / (32/LsiFreq)
- = LsiFreq * _ulIWDGTime / 32000
- 实际测试LsiFreq = 34000,所以这里取1的时候 大概就是1ms
- */
- IWDG_SetReload(_ulIWDGTime);
-
- /* 重载IWDG计数 */
- IWDG_ReloadCounter();
-
- /* 使能 IWDG (LSI oscillator 由硬件使能) */
- IWDG_Enable();
- }
-
- /*
- *********************************************************************************************************
- * 函 数 名: IWDG_Feed
- * 功能说明: 喂狗函数
- * 形 参:无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void IWDG_Feed(void)
- {
- IWDG_ReloadCounter();
- }
复制代码 u 五个RTX任务的实现:
|
|