|

楼主 |
发表于 2017-11-28 16:29:32
|
显示全部楼层
30.8 实验例程说明(RTX)
30.8.1 STM32F407开发板实验
配套例子:
V5-1041_RL-TCPnet实验SNTP应用(RTX)
实验目的:
1. 学习RL-TCPnet的SNTP使用。
实验内容:
1. 务必将网线接到能够联网的路由器或者交换机上面测试,因为本实验要用到外网。
2. 本实验串口每秒打印一次从NTP服务器获取的时间。
3. 国内免费稳定的SNTP服务器很少,当前使用的这个时好时坏,如果大家测试不成功的话也是正常的。
实验操作:
详见本章节30.6小节。
配置向导文件设置(Net_Config.c):
详见本章节30.4小节。
调试文件设置(Net_Debug.c):
详见本章节30.5小节。
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功能的测试,此文件主要实现从远程NTP服务器获取当前日期和时间,精度到秒。
- #include "includes.h"
-
-
-
- /*
- *********************************************************************************************************
- * 用于本文件的调试
- *********************************************************************************************************
- */
- #if 1
- #define printf_debug printf
- #else
- #define printf_debug(...)
- #endif
-
-
- /*
- **********************************************************************************************************
- 变量
- **********************************************************************************************************
- */
- U8 ntp_server[4] = {182,16,3,162}; /* SNTP服务器地址 */
-
-
- /*
- *********************************************************************************************************
- * 函 数 名: time_cback
- * 功能说明: SNTP获取时间回到函数
- * 形 参: 无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- static void time_cback (uint32_t time)
- {
- struct tm *t_tm;
-
- if (time == 0)
- {
- printf_debug ("错误, 服务器未响应或者网络状态比较差\\r\\n");
- }
- else
- {
- /* 由于是格林尼治时间,所以北京时间要加8个小时 */
- time += 8*60*60;
-
- /* 将获取的UNIX时间戳转换成年月日时分秒的格式 */
- t_tm = localtime((unsigned int *)&time);
-
- /* 格林尼治时间是从1900年开始的,这要加上 */
- t_tm->tm_year += 1900;
-
- /* 获取的月份范围是0-11,这里要加1 */
- t_tm->tm_mon += 1;
-
- printf_debug ("UNIX时间戳:%d 日期:%02d/%02d/%02d 时间:%02d:%02d:%02d\\r\\n",
- time,
- t_tm->tm_year,
- t_tm->tm_mon,
- t_tm->tm_mday,
- t_tm->tm_hour,
- t_tm->tm_min,
- t_tm->tm_sec);
- }
- }
-
- /*
- *********************************************************************************************************
- * 函 数 名: get_time
- * 功能说明: 从SNTP服务器获取当前时间
- * 形 参: 无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- static void get_time (void)
- {
- if (sntp_get_time((U8 *)&ntp_server[0], &time_cback) == __TRUE)
- {
- printf_debug ("SNTP请求已经发送成功\\r\\n");
- }
- else
- {
- printf_debug ("失败, SNTP未就绪或者参数错误\\r\\n");
- }
- }
-
- /*
- *********************************************************************************************************
- * 函 数 名: TCPnetTest
- * 功能说明: TCPnet应用
- * 形 参: 无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void TCPnetTest(void)
- {
- uint32_t tstart, tend;
-
- /* 初始化起始时间 */
- tstart = os_time_get();
-
- while (1)
- {
- /* RL-TCPnet处理函数 */
- main_TcpNet();
-
- /* 每秒从NTP服务器获取一次时间 */
- tend = os_time_get() - tstart;
- if(tend >= 1000)
- {
- tstart = os_time_get();
- get_time();
- }
-
- os_dly_wait(2);
- }
- }
复制代码
30.8.2 STM32F429开发板实验
配套例子:
V6-1041_RL-TCPnet实验SNTP应用(RTX)
实验目的:
1. 学习RL-TCPnet的SNTP使用。
实验内容:
1. 务必将网线接到能够联网的路由器或者交换机上面测试,因为本实验要用到外网。
2. 本实验串口每秒打印一次从NTP服务器获取的时间。
3. 国内免费稳定的SNTP服务器很少,当前使用的这个时好时坏,如果大家测试不成功的话也是正常的。
实验操作:
详见本章节30.6小节。
配置向导文件设置(Net_Config.c):
详见本章节30.4小节。
调试文件设置(Net_Debug.c):
详见本章节30.5小节。
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功能的测试,此文件主要实现从远程NTP服务器获取当前日期和时间,精度到秒。
- #include "includes.h"
-
-
-
- /*
- *********************************************************************************************************
- * 用于本文件的调试
- *********************************************************************************************************
- */
- #if 1
- #define printf_debug printf
- #else
- #define printf_debug(...)
- #endif
-
-
- /*
- **********************************************************************************************************
- 变量
- **********************************************************************************************************
- */
- U8 ntp_server[4] = {182,16,3,162}; /* SNTP服务器地址 */
-
-
- /*
- *********************************************************************************************************
- * 函 数 名: time_cback
- * 功能说明: SNTP获取时间回到函数
- * 形 参: 无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- static void time_cback (uint32_t time)
- {
- struct tm *t_tm;
-
- if (time == 0)
- {
- printf_debug ("错误, 服务器未响应或者网络状态比较差\\r\\n");
- }
- else
- {
- /* 由于是格林尼治时间,所以北京时间要加8个小时 */
- time += 8*60*60;
-
- /* 将获取的UNIX时间戳转换成年月日时分秒的格式 */
- t_tm = localtime((unsigned int *)&time);
-
- /* 格林尼治时间是从1900年开始的,这要加上 */
- t_tm->tm_year += 1900;
-
- /* 获取的月份范围是0-11,这里要加1 */
- t_tm->tm_mon += 1;
-
- printf_debug ("UNIX时间戳:%d 日期:%02d/%02d/%02d 时间:%02d:%02d:%02d\\r\\n",
- time,
- t_tm->tm_year,
- t_tm->tm_mon,
- t_tm->tm_mday,
- t_tm->tm_hour,
- t_tm->tm_min,
- t_tm->tm_sec);
- }
- }
-
- /*
- *********************************************************************************************************
- * 函 数 名: get_time
- * 功能说明: 从SNTP服务器获取当前时间
- * 形 参: 无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- static void get_time (void)
- {
- if (sntp_get_time((U8 *)&ntp_server[0], &time_cback) == __TRUE)
- {
- printf_debug ("SNTP请求已经发送成功\\r\\n");
- }
- else
- {
- printf_debug ("失败, SNTP未就绪或者参数错误\\r\\n");
- }
- }
-
- /*
- *********************************************************************************************************
- * 函 数 名: TCPnetTest
- * 功能说明: TCPnet应用
- * 形 参: 无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void TCPnetTest(void)
- {
- uint32_t tstart, tend;
-
- /* 初始化起始时间 */
- tstart = os_time_get();
-
- while (1)
- {
- /* RL-TCPnet处理函数 */
- main_TcpNet();
-
- /* 每秒从NTP服务器获取一次时间 */
- tend = os_time_get() - tstart;
- if(tend >= 1000)
- {
- tstart = os_time_get();
- get_time();
- }
-
- os_dly_wait(2);
- }
- }
复制代码 |
|