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

由于需要在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. ubuntu下删除U盘文件到回收站无法清空问题的解决

    Ubuntu可以自动加载U盘 每当,拷贝新的文件,而空间不足的时候,就会删除原有的文件. 可是,它不是彻底删除,而是放在垃圾箱中(/home/mrc/.local/share/Trash/files) ...

  2. LeetCode86 分隔链表

    idea: 烦死了,这个题一直因为创立的指针为空,或者接入结点方法不对,结果将两个小链表搞混乱了,不过具体思路ok.将小值结点成一组,大值结点成一组,最后在首尾相连,实现起来也比较简单 /**  *  ...

  3. mybatis_19

    id username birthday sex address 1 王五 2 10 张三 2014-07-10 1 北京市 16 张小明 1 河南郑州 22 陈小明 1 河南郑州 24 张三丰 1 ...

  4. git提交的时候,报错yarn run v1.21.1 ,SyntaxError: Cannot use import statement outside a module 解决

    原因是 lint-staged这个依赖中,需要的node的版本是, 而我使用的node版本是12.13.1 ,切换成14.17.0就可以了

  5. Centos7.6操作系统安装

    新建虚拟机 默认下一步 稍后安装操作系统 选择对应的操作系统和版本 指定虚拟机名称和存储位置 处理器配置 内存配置:图形化界面至少2G,字符界面至少1G. 网络类型默认为NAT I/O控制器类型默认L ...

  6. Android工程接入UnityLibrary工程

    目录结构 Unity工程指UnityLibrary目录下文件: 安卓工程指app目录下文件: 整体指App目录下不包括app和UnityLibrary: 1.Unity打包时勾选导出安卓工程: 拷贝g ...

  7. Redis Stream Commands 命令学习-1 XADD XRANGE XREVRANGE

    概况 A Redis stream is a data structure that acts like an append-only log. You can use streams to reco ...

  8. Redis6.0.9集群搭建

    前提条件: Redis版本:6.0.9(因为5.0之前创建用的是redis-trib,还需要ruby,ruby-gem) 安装环境: Centos7 1. 准备配置文件 一个是通用文件:redis-c ...

  9. 使用EFCore的Code First和MySql数据库迁移

    1. 感慨一下 随着.net core的持续更新和升级,至少对于从事.net开发的人员和即将踏入这个领域的人来说,我相信大家的热情还是持续高涨的.国内的.net开发生态相比于之前来说,还是大有所好转的 ...

  10. SpringBoot——模板引擎及原理

    更多内容,前往IT-BLOG 一.模板引擎的思想 模板是为了将显示与数据分离,模板技术多种多样,但其本质都是将模板文件和数据通过模板引擎生成最终的 HTML代码. 二.SpringBoot模板引擎 S ...