|

楼主 |
发表于 2017-11-25 15:56:38
|
显示全部楼层
28.8 实验例程说明(RTX)
28.8.1 STM32F407开发板实验
配套例子:
V5-1037_RL-TCPnet实验_DNS应用(RTX)
实验目的:
1. 学习RL-TCPnet的DNS使用。
实验内容:
1. 用户务必将网线接到能够联网的路由器或者交换机上面测试,因为DNS域名解析需要连接网络才行。
2. 像腾讯,百度等网址都有多个IP地址,如果用户测试DNS返回的地址不同,这种情况是正常的。
3. 按键K1按下,返回www.armfly.com的IP地址。
4. 按键K2按下,返回www.baidu.com的IP地址。
5. 按键K3按下,返回www.qq.com的IP地址。
实验操作:
详见本章节28.6小节。
配置向导文件设置(Net_Config.c):
详见本章节28.3小节。
调试文件设置(Net_Debug.c):
详见本章节28.4小节。
RTX配置:
RTX配置向导详情如下:
Task Configuration
(1)Number of concurrent running tasks
允许创建6个任务,实际创建了如下5个任务:
AppTaskUserIF任务 :按键消息处理。
AppTaskLED任务 :LED闪烁。
AppTaskMsgPro任务 :按键检测。
AppTaskTCPMain任务:RL-TCPnet测试任务。
AppTaskStart任务 :启动任务,也是最高优先级任务,这里实现RL-TCPnet的时间基准更新。
(2)Number of tasks with user-provided stack
创建的5个任务都是采用自定义堆栈方式。
(3)Run in privileged mode
设置任务运行在非特权级模式。
RTX任务调试信息:
程序设计:
任务栈大小分配:
staticuint64_t AppTaskUserIFStk[1024/8]; /* 任务栈 */
staticuint64_t AppTaskLEDStk[1024/8]; /* 任务栈 */
staticuint64_t AppTaskMsgProStk[1024/8]; /* 任务栈 */
staticuint64_t AppTaskTCPMainStk[2048/8]; /* 任务栈 */
staticuint64_t AppTaskStartStk[1024/8]; /* 任务栈 */
将任务栈定义成uint64_t类型可以保证任务栈是8字节对齐的,8字节对齐的含义就是数组的首地址对8求余等于0。如果不做8字节对齐的话,部分C语言库函数、浮点运算和uint64_t类型数据运算会出问题。
系统栈大小分配:
RTX初始化:
- /*
- *********************************************************************************************************
- * 函 数 名: main
- * 功能说明: 标准c程序入口。
- * 形 参: 无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- int main (void)
- {
- /* 初始化外设 */
- bsp_Init();
-
- /* 创建启动任务 */
- os_sys_init_user (AppTaskStart, /* 任务函数 */
- 5, /* 任务优先级 */
- &AppTaskStartStk, /* 任务栈 */
- sizeof(AppTaskStartStk)); /* 任务栈大小,单位字节数 */
- while(1);
- }
复制代码 硬件外设初始化
硬件外设的初始化是在 bsp.c 文件实现:
- /*
- *********************************************************************************************************
- * 函 数 名: bsp_Init
- * 功能说明: 初始化所有的硬件设备。该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。只需要调用一次
- * 形 参:无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void bsp_Init(void)
- {
- /*
- 由于ST固件库的启动文件已经执行了CPU系统时钟的初始化,所以不必再次重复配置系统时钟。
- 启动文件配置了CPU主时钟频率、内部Flash访问速度和可选的外部SRAM FSMC初始化。
-
- 系统时钟缺省配置为168MHz,如果需要更改,可以修改 system_stm32f4xx.c 文件
- */
- /* 优先级分组设置为4,可配置0-15级抢占式优先级,0级子优先级,即不存在子优先级。*/
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
-
- bsp_InitDWT(); /* 初始化DWT */
- bsp_InitUart(); /* 初始化串口 */
- bsp_InitKey(); /* 初始化按键变量(必须在 bsp_InitTimer() 之前调用) */
- bsp_InitLed(); /* 初始LED指示灯端口 */
- }
复制代码 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)); /* 任务栈大小,单位字节数 */
-
- HandleTaskTCPMain = os_tsk_create_user(AppTaskTCPMain, /* 任务函数 */
- 4, /* 任务优先级 */
- &AppTaskTCPMainStk, /* 任务栈 */
- sizeof(AppTaskTCPMainStk)); /* 任务栈大小,单位字节数 */
- }
复制代码 五个RTX任务的实现:
RL-TCPnet功能测试
这里专门创建了一个app_tcpnet_lib.c文件用于RL-TCPnet功能的测试,这里通过函数get_host_by_name来解析网址对应的IP地址。
- #include "includes.h"
-
-
-
- /*
- *********************************************************************************************************
- * 用于本文件的调试
- *********************************************************************************************************
- */
- #if 1
- #define printf_debug printf
- #else
- #define printf_debug(...)
- #endif
-
-
- /*
- *********************************************************************************************************
- * 变量
- *********************************************************************************************************
- */
- char const *hosts[3] =
- {
- "www.armfly.com",
- "www.baidu.com",
- "www.qq.com",
- };
-
- /*
- *********************************************************************************************************
- * 函 数 名: dns_cbfunc
- * 功能说明: 函数get_host_by_name的调函数。
- * 形 参: event 事件类型
- * ip 如果事件类型是DNS_EVT_SUCCESS,此指针变量指向返回的IP地址缓冲区。
- * 返 回 值: 无
- *********************************************************************************************************
- */
- static void dns_cbfunc (unsigned char event, unsigned char *ip)
- {
- switch (event)
- {
- /* 成功解析地址 */
- case DNS_EVT_SUCCESS:
- printf_debug("%d.%d.%d.%d\\n",ip[0],ip[1],ip[2],ip[3]);
- break;
-
- /* DNS记录数据库中不存在此地址 */
- case DNS_EVT_NONAME:
- printf_debug("Host Name does not exist in DNS record database.\\n");
- break;
-
- /* 允许的DNS解析重试次数已经用完,仍无法解析,时间超时 */
- case DNS_EVT_TIMEOUT:
- printf_debug("DNS Resolver Timeout expired, Host Address not resolved.\\n");
- break;
-
- /* DNS协议错误,收到无效或者被损坏的回复 */
- case DNS_EVT_ERROR:
- printf_debug("DNS Resolver Protocol Error, Host Address not resolved.\\n");
- return;
- }
- }
-
- /*
- *********************************************************************************************************
- * 函 数 名: TCPnetTest
- * 功能说明: TCPnet应用
- * 形 参: 无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void TCPnetTest(void)
- {
- OS_RESULT xResult;
- const uint16_t usMaxBlockTime = 2; /* 延迟周期 */
-
-
- while (1)
- {
- /* RL-TCPnet处理函数 */
- main_TcpNet();
-
- /* 按键消息的处理 */
- if(os_evt_wait_or(0xFFFF, usMaxBlockTime) == OS_R_EVT)
- {
- xResult = os_evt_get ();
- switch (xResult)
- {
- /* 接收到按键K1按下消息,返回www.armfly.com的IP地址。 */
- case KEY1_BIT0:
- printf_debug("网址www.armfly.com的IP地址:");
- get_host_by_name ((U8 *)hosts[0], dns_cbfunc);
- break;
-
- /* 接收到K2键按下消息,返回www.baidu.com的IP地址 */
- case KEY2_BIT1:
- printf_debug("网址www.baidu.com的IP地址:");
- get_host_by_name ((U8 *)hosts[1], dns_cbfunc);
- break;
-
- /* 接收到K3键按下消息,返回www.qq.com的IP地址 */
- case KEY3_BIT2:
- printf_debug("网址www.qq.com的IP地址:");
- get_host_by_name ((U8 *)hosts[2], dns_cbfunc);
- break;
-
- /* 其他的键值不处理 */
- default:
- break;
- }
- }
- }
- }
复制代码
28.8.2 STM32F429开发板实验
配套例子:
V6-1037_RL-TCPnet实验_DNS应用(RTX)
实验目的:
1. 学习RL-TCPnet的DNS使用。
实验内容:
1. 用户务必将网线接到能够联网的路由器或者交换机上面测试,因为DNS域名解析需要连接网络才行。
2. 像腾讯,百度等网址都有多个IP地址,如果用户测试DNS返回的地址不同,这种情况是正常的。
3. 按键K1按下,返回www.armfly.com的IP地址。
4. 按键K2按下,返回www.baidu.com的IP地址。
5. 按键K3按下,返回www.qq.com的IP地址。
实验操作:
详见本章节28.6小节。
配置向导文件设置(Net_Config.c):
详见本章节28.3小节。
调试文件设置(Net_Debug.c):
详见本章节28.4小节。
RTX配置:
RTX配置向导详情如下:
Task Configuration
(1)Number of concurrent running tasks
允许创建6个任务,实际创建了如下5个任务:
AppTaskUserIF任务 :按键消息处理。
AppTaskLED任务 :LED闪烁。
AppTaskMsgPro任务 :按键检测。
AppTaskTCPMain任务:RL-TCPnet测试任务。
AppTaskStart任务 :启动任务,也是最高优先级任务,这里实现RL-TCPnet的时间基准更新。
(2)Number of tasks with user-provided stack
创建的5个任务都是采用自定义堆栈方式。
(3)Run in privileged mode
设置任务运行在非特权级模式。
RTX任务调试信息:
程序设计:
任务栈大小分配:
staticuint64_t AppTaskUserIFStk[1024/8]; /* 任务栈 */
staticuint64_t AppTaskLEDStk[1024/8]; /* 任务栈 */
staticuint64_t AppTaskMsgProStk[1024/8]; /* 任务栈 */
staticuint64_t AppTaskTCPMainStk[2048/8]; /* 任务栈 */
staticuint64_t AppTaskStartStk[1024/8]; /* 任务栈 */
将任务栈定义成uint64_t类型可以保证任务栈是8字节对齐的,8字节对齐的含义就是数组的首地址对8求余等于0。如果不做8字节对齐的话,部分C语言库函数、浮点运算和uint64_t类型数据运算会出问题。
系统栈大小分配:
RTX初始化:
- /*
- *********************************************************************************************************
- * 函 数 名: main
- * 功能说明: 标准c程序入口。
- * 形 参: 无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- int main (void)
- {
- /* 初始化外设 */
- bsp_Init();
-
- /* 创建启动任务 */
- os_sys_init_user (AppTaskStart, /* 任务函数 */
- 5, /* 任务优先级 */
- &AppTaskStartStk, /* 任务栈 */
- sizeof(AppTaskStartStk)); /* 任务栈大小,单位字节数 */
- while(1);
- }
复制代码 硬件外设初始化
硬件外设的初始化是在 bsp.c 文件实现:
- /*
- *********************************************************************************************************
- * 函 数 名: bsp_Init
- * 功能说明: 初始化所有的硬件设备。该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。只需要调用一次
- * 形 参:无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void bsp_Init(void)
- {
- /*
- 由于ST固件库的启动文件已经执行了CPU系统时钟的初始化,所以不必再次重复配置系统时钟。
- 启动文件配置了CPU主时钟频率、内部Flash访问速度和可选的外部SRAM FSMC初始化。
-
- 系统时钟缺省配置为168MHz,如果需要更改,可以修改 system_stm32f4xx.c 文件
- */
- /* 优先级分组设置为4,可配置0-15级抢占式优先级,0级子优先级,即不存在子优先级。*/
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
-
- SystemCoreClockUpdate(); /* 根据PLL配置更新系统时钟频率变量 SystemCoreClock */
-
- bsp_InitDWT(); /* 初始化DWT */
- bsp_InitUart(); /* 初始化串口 */
- bsp_InitKey(); /* 初始化按键变量(必须在 bsp_InitTimer() 之前调用) */
-
- bsp_InitExtIO(); /* FMC总线上扩展了32位输出IO, 操作LED等外设必须初始化 */
- bsp_InitLed(); /* 初始LED指示灯端口 */
- }
复制代码 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)); /* 任务栈大小,单位字节数 */
-
- HandleTaskTCPMain = os_tsk_create_user(AppTaskTCPMain, /* 任务函数 */
- 4, /* 任务优先级 */
- &AppTaskTCPMainStk, /* 任务栈 */
- sizeof(AppTaskTCPMainStk)); /* 任务栈大小,单位字节数 */
- }
复制代码 五个RTX任务的实现:
RL-TCPnet功能测试
这里专门创建了一个app_tcpnet_lib.c文件用于RL-TCPnet功能的测试,这里通过函数get_host_by_name来解析网址对应的IP地址。
- #include "includes.h"
-
-
-
- /*
- *********************************************************************************************************
- * 用于本文件的调试
- *********************************************************************************************************
- */
- #if 1
- #define printf_debug printf
- #else
- #define printf_debug(...)
- #endif
-
-
- /*
- *********************************************************************************************************
- * 变量
- *********************************************************************************************************
- */
- char const *hosts[3] =
- {
- "www.armfly.com",
- "www.baidu.com",
- "www.qq.com",
- };
-
- /*
- *********************************************************************************************************
- * 函 数 名: dns_cbfunc
- * 功能说明: 函数get_host_by_name的调函数。
- * 形 参: event 事件类型
- * ip 如果事件类型是DNS_EVT_SUCCESS,此指针变量指向返回的IP地址缓冲区。
- * 返 回 值: 无
- *********************************************************************************************************
- */
- static void dns_cbfunc (unsigned char event, unsigned char *ip)
- {
- switch (event)
- {
- /* 成功解析地址 */
- case DNS_EVT_SUCCESS:
- printf_debug("%d.%d.%d.%d\\n",ip[0],ip[1],ip[2],ip[3]);
- break;
-
- /* DNS记录数据库中不存在此地址 */
- case DNS_EVT_NONAME:
- printf_debug("Host Name does not exist in DNS record database.\\n");
- break;
-
- /* 允许的DNS解析重试次数已经用完,仍无法解析,时间超时 */
- case DNS_EVT_TIMEOUT:
- printf_debug("DNS Resolver Timeout expired, Host Address not resolved.\\n");
- break;
-
- /* DNS协议错误,收到无效或者被损坏的回复 */
- case DNS_EVT_ERROR:
- printf_debug("DNS Resolver Protocol Error, Host Address not resolved.\\n");
- return;
- }
- }
-
- /*
- *********************************************************************************************************
- * 函 数 名: TCPnetTest
- * 功能说明: TCPnet应用
- * 形 参: 无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void TCPnetTest(void)
- {
- OS_RESULT xResult;
- const uint16_t usMaxBlockTime = 2; /* 延迟周期 */
-
-
- while (1)
- {
- /* RL-TCPnet处理函数 */
- main_TcpNet();
-
- /* 按键消息的处理 */
- if(os_evt_wait_or(0xFFFF, usMaxBlockTime) == OS_R_EVT)
- {
- xResult = os_evt_get ();
- switch (xResult)
- {
- /* 接收到按键K1按下消息,返回www.armfly.com的IP地址。 */
- case KEY1_BIT0:
- printf_debug("网址www.armfly.com的IP地址:");
- get_host_by_name ((U8 *)hosts[0], dns_cbfunc);
- break;
-
- /* 接收到K2键按下消息,返回www.baidu.com的IP地址 */
- case KEY2_BIT1:
- printf_debug("网址www.baidu.com的IP地址:");
- get_host_by_name ((U8 *)hosts[1], dns_cbfunc);
- break;
-
- /* 接收到K3键按下消息,返回www.qq.com的IP地址 */
- case KEY3_BIT2:
- printf_debug("网址www.qq.com的IP地址:");
- get_host_by_name ((U8 *)hosts[2], dns_cbfunc);
- break;
-
- /* 其他的键值不处理 */
- default:
- break;
- }
- }
- }
- }
复制代码 |
|