博客主页:链接。转载请注明出处!

由于需要在stm32上使用USB Host CDC-ECM,连接EC20发送数据到服务器,接触到了ThreadX实时操作系统。

在调研过程中,发现stm32官方USB库内只有Device ECM类,无法作为host连接网卡;

电脑上经常使用的tinyusb,对stm设备的device支持较差;

此外还有lrndis、TeenyUSB,提供了host ecm类的支持,但使用并不方便,且有的已很少有人维护(小开源项目难免如此)。

最终决定使用微软的Azure RTOS ThreadX全家桶,利用NetX Duo+USBX实现对ECM网卡的支持。ThreadX的性能和存储占用都优化得很好,且中间件齐全,免去了很多自己配置的麻烦。目前ThreadX已经开源,并加入CubeMX,直接使用可视化界面就可完成配置,解决一些小坑之后十分方便,遂写此随笔以作记录、分享。

本文使用的工具包括CubeMX、MDK,内容假设阅读者已基本掌握这两个软件的使用。在学习过程中,参考了另两篇教程,附上链接:

https://juejin.cn/post/7099829592713592840

https://blog.csdn.net/wallace89/article/details/114941859

一、CubeMX生成模板

1. 配置RCC、时钟、SYS、GPIO

RCC设置外部晶振,这个根据板子情况调整,我这里高低速都是外部晶振

时钟配置,和平时一样,可以输入HCLK让cubemx自动设置,也可手动调,48MHz时钟一定要有

系统设置内,debug根据板子设置,我使用的是jlink的SW调试口,所以选择serial wire。时基源选择任意一个没用到的TIM。

最后配置板子上三个LED灯的GPIO,根据自己板子上情况修改。

2. 配置串口和USB

根据板子,配置串口用于调试

配置USB FS,用于和EC20通信

3. 重头戏:配置Azure RTOS

首先安装所需软件包

我用的MCU是stm32f4系列,因此找到AZRTOS-F4。勾选Core以及需要使用的USBX-UX Host Class CDC ECM,会提示所选的包还有依赖项没选上,根据提示补齐。如果不需要USB和网络,只选择threadx core就行.

回到主界面,可以看到左边X-CUBE-AZRTOS-F4变得可选,点击打开配置。

可以根据需要修改配置,我这里基本保持默认,后面有需求再修改。

4. 生成项目模板

常规操作,注意:1. IDE选用自己使用的;2. 增大堆栈,我均改为0x2000;3. .c/.h分开

二、Keil内编写跑马灯代码

1. 编辑app_azure_rtos.h

增加对GPIO、串口、printf的支持,代码:

/* USER CODE BEGIN Includes */
#include "main.h"
#include "stdio.h"
#include "usart.h"
#if 1
__asm__(".global __use_no_semihosting"); FILE __stdout;
//define function _sys_exit() to avoid using semi-hosting mode
void _sys_exit(int x)
{
x = x;
}
//redefine function fputc to redirect output
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart6, (uint8_t *)&ch, 1, 0x10);
return ch;
}
#endif
/* USER CODE END Includes */

增加线程函数申明

/* USER CODE BEGIN EFP */
void app1_LED123(ULONG thread_input);
/* USER CODE END EFP */

2. 编辑app_azure_rtos.h

文件前面增加线程参数设置

/* USER CODE BEGIN PD */
//defination of app1
#define APP1_PRIO 15u //优先级,越大越不优先
#define APP1_STACKSIZE 1024u //堆栈大小,注意大于cubemx内设置的最低大小
static TX_THREAD app1_TCB; //线程控制块
static uint8_t app1_STACK[APP1_STACKSIZE]; //堆栈
/* USER CODE END PD */

在 tx_application_define函数内,增加创建线程的操作,并串口显示创建状态。

/* USER CODE BEGIN  tx_application_define */
printf("tx_application_define\n");
UINT status = tx_thread_create(&app1_TCB,
"app1_led123",
app1_led123,
0,
&app1_STACK[0],
APP1_STACKSIZE,
APP1_PRIO,
APP1_PRIO,
TX_NO_TIME_SLICE,
TX_AUTO_START);
printf("thread create status:%d\n", status);
/* USER CODE END tx_application_define */

这里遇到一个坑,我的堆栈大小起初设置得低于cubemx中指定的400B,因此线程创建失败。可通过status的值判断是否是线程创建失败导致的问题。

最后,在文件末尾编写线程代码:

/* USER CODE BEGIN  0 */
void app1_led123(ULONG thread_input)
{
printf("app1_led123 start\n");
while(1) {
HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
tx_thread_sleep(10);
HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin);
tx_thread_sleep(10);
HAL_GPIO_TogglePin(LED3_GPIO_Port, LED3_Pin);
tx_thread_sleep(10);
}
}
/* USER CODE END 0 */

3. 设置编译和调试参数

在魔法棒内设置使用v6编译器、勾选上microlib。debug选项卡内也选择自己使用的调试器。

设置完成,即可编译下载,运行自己的程序!

——————THE END——————

博客主页:链接。转载请注明出处!

使用STM32CubeMX生成ThreadX实时操作系统工程模板的更多相关文章

  1. QNX 实时操作系统(Quick Unix)

    Gordon Bell和Dan Dodge在1980年成立了Quantum Software Systems公司,他们根据大学时代的一些设想写出了一个能在IBM PC上运行的名叫QUNIX(Quick ...

  2. 第三周作业、实时操作系统µC/OS介绍及其它内容

    作业要求 见<实时控制软件设计>第三周作业 1 阅读笔记--µC/OS 1.1 基本介绍 µC/OS是由Micrium公司研发的实时操作系统,以µC/OS-II或µC/OS-III为内核, ...

  3. VxWorks Fuzzing 之道:VxWorks 工控实时操作系统漏洞挖掘调试与利用揭秘

    转载:freebuf 0×00 前言 关于VxWorks,这里引用44CON议题<攻击 VxWorks:从石器时代到星际>探究 一文章中的介绍: VxWorks 是世界上使用最广泛的一种在 ...

  4. TI 实时操作系统SYS/BIOS使用总结

    1:概述: SYS/BIOS 是一个可扩展的实时的操作系统.具有非常快速的响应时间(在中断和任务切换时达到较短的延迟),响应时间的确定性,强壮的抢占系统,优化的内存分配和堆栈管理(尽量少的消耗和碎片) ...

  5. 嵌入式实时操作系统VxWorks入门――开发环境构建[转]

    VxWorks 操作系统是美国WindRiver公司于1983年设计开发的一种嵌入式实时操作系统(RTOS),它以其良好的可靠性和卓越的实时性被广泛地应用在通 信.军事.航空.航天等高精尖技术及实时性 ...

  6. 使用Nucleus SE实时操作系统

    使用Nucleus SE实时操作系统 Using the Nucleus SE real-time operating system 到目前为止,在本系列文章中,我们详细介绍了Nucleus SE提供 ...

  7. ucos实时操作系统学习笔记——内核结构和任务创建

    对于ucos实时操作系统,邵贝贝的那本书已经写得很详细了,我因为之前不深的研究过ucos,所以在这里做一个笔记,写一些个人对该操作系统的理解,仅仅是个人理解,如果有人看到这边随笔有不对的地方,望给我指 ...

  8. ucos实时操作系统学习笔记——操作系统在STM32的移植

    使用ucos实时操作系统是在上学的时候,导师科研项目中.那时候就是网上找到操作系统移植教程以及应用教程依葫芦画瓢,功能实现也就罢了,没有很深入的去研究过这个东西.后来工作了,闲来无聊就研究了一下这个只 ...

  9. 嵌入式实时操作系统μCOS原理与实践任务控制与时间的解析

    /*************************************************************************************************** ...

  10. vxworks 实时操作系统

    VxWorks 是美国 Wind River System 公司( 以下简称风河公司 ,即 WRS 公司)推出的一个实时操作系统.Tornado 是WRS 公司推出的一套实时操作系统开发环境,类似Mi ...

随机推荐

  1. 三艾云 Kubernetes 集群最佳实践

    三艾云 Kubernetes 集群最佳实践 三艾云 Kubernetes 集群最佳实践 容器是 Cloud Native 的基石,它们之间的关系不言而喻.了解容器对于学习 Cloud Native 也 ...

  2. c# 递归应用 完成js文件自动引用

    背景: 两张表,分别是 :sys_tbl,和 sys_field,其中:sys_tbl 是系统所有表的信息,包含两个字段 :code(表名),name(表描述信息):sys_fld 是记录第张表中的字 ...

  3. HDF格式遥感影像批量转为TIFF格式:ArcPy实现

      本文介绍基于Python中ArcPy模块,实现大量HDF格式栅格图像文件批量转换为TIFF格式的方法.   首先,来看看我们想要实现的需求.   在一个名为HDF的文件夹下,有五个子文件夹:每一个 ...

  4. Android笔记--案例:找回密码

    找回密码 具体实现: 登录成功: 报告密码不同: 报告验证码错误: 代码相关: 找回密码的界面很简单,不细说了,直接写就行 找回密码的逻辑实现: 下一次就去写数据存储啦! 拜拜!

  5. 陈大好:持续创造小而美的产品丨独立开发者 x 开放麦

    本文内容来自RTE NG-Lab 计划中「独立开发者 x 开放麦」活动分享,分享嘉宾独立开发者 @陈大好. 本次活动中,来自 W2solo 独立开发者社区的管理员 @Eric Woo 也以<独立 ...

  6. day07-SpringBoot接收参数相关注解

    SpringBoot接收参数相关注解 1.基本介绍 SpringBoot接收客户端提交数据/参数会使用到相关注解 详解@PathVariable.@RequestHeader.@ModelAttrib ...

  7. 刷爆 LeetCode 双周赛 100,单方面宣布第一题最难

    本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问. 大家好,我是小彭. 上周末是 LeetCode 第 100 场双周赛,你参加了吗?这场周赛整体没有 Hard ...

  8. 为什么wait()需要在同步代码块内使用

    我们还是通过源代码和代码注释来学习这个问题 我们先来看看wait方法的注释,这里截取最根源的native方法给的注释 Causes the current thread to wait until e ...

  9. 使用webpack 优化自己的项目。

    一.首先要了解概念:module,chunk 和 bundle 到底是什么? module,chunk 和 bundle 其实就是同一份逻辑代码在不同转换场景下的取了三个名字: 我们直接写出来的是 m ...

  10. python调用打印机打印文件,图片,pdf等

    引言 python连接打印机进行打印,可能根据需求的不同,使用不同的函数模块. 如果你只是简单的想打印文档,比如office文档,你可以使用ShellExecute方法,对于微软office的文档.p ...