【运行在freertos上的microros 任何stm32平台】

这篇具有很好参考价值的文章主要介绍了【运行在freertos上的microros 任何stm32平台】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

`本文主要分享一下如何快速在stm32f103或stm32系列的任意板子上运行microros的具体步骤。(所需要的文件已经生成好了)。
生成的步骤极其踩坑,是一段令人痛苦的回忆。
生成静态链接库的踩坑主要内容就是 所有资源都是外网,需要代理,如果网络不通畅所有的步骤都得重新来,尤其是在docker 容器运行时的代理配置,直接给我干吐血了…
好的废话不多说,此篇文章的只需要下载工程后,即可使用(对于stm32f103rct6),其他芯片的可通过cubemx软件选择对应芯片即可。
对于microros如何从源码开始编译可点击以下链接

microros部署教程
microros github源码
microros 官网

一、工程下载

链接:https://pan.baidu.com/s/1QUw-3e9ZpeAaA7Khyjd_Dg?pwd=iebe
提取码:iebe
–来自百度网盘超级会员V4的分享

二、使用步骤

1.了解每个文件夹的作用

microros2pc_test 用于开发板与linux端ros2通信测试功能包
microros_ws 构建静态链接库,agent等功能包的setup功能包 具体使用可参考microros官网
microros_agent_ws linux端运行microros的agent功能包
freertos_rosnode stm32工程文件,包含了静态链接 .a文件
在freertos_rosnode下的micro_ros_stm32cubemx_utils文件夹是极其重要的文件夹,一般不做修改,移植所需文件夹 。同时可参考其中的main.c文件如何编程microros

2.移植到自己的工程

打开stm32 cubemx,创建一个新的工程 (我以stm32f103rct6为例)

1.正常配置时钟树即可

2.rcc配置 HSE选择crystal

选择中间件 middleware,选择freertos。如下配置 选择v2版本 选择tasks and queues双击已存在的tasks
配置 stack size 3000 allocation static
【运行在freertos上的microros 任何stm32平台】,stm32,嵌入式硬件,单片机
3.配置usart:
mode 选择asynchronous
dma settings 点击add
rx mode选择circular
tx默认即可
两者优先级都为非常高
nvic settings 打开中断

配置图如下
【运行在freertos上的microros 任何stm32平台】,stm32,嵌入式硬件,单片机
4.sys配置
打开debug
timebase source 选择tim1

【运行在freertos上的microros 任何stm32平台】,stm32,嵌入式硬件,单片机
5.工程管理:
toolchan/ide 选择makefile
【运行在freertos上的microros 任何stm32平台】,stm32,嵌入式硬件,单片机
6.代码生成:
【运行在freertos上的microros 任何stm32平台】,stm32,嵌入式硬件,单片机
生成代码 打开工程所在位置,将百度网盘下载的工程中的micro_ros_stm32cubemx_utils文件夹复制到新生成的工程文件夹目录下
如图所示
【运行在freertos上的microros 任何stm32平台】,stm32,嵌入式硬件,单片机

使用你最常用的ide或者编辑器打开工程(我以clion为例,配置文件可复制.idea文件夹到新工程目录下):需要配置好工具链,如果没有配置,可参考稚晖君配置教程(clion)
编辑makefile文件:
将以下内容复制到 build the application之前

#######################################
# micro-ROS addons
#######################################
LDFLAGS += micro_ros_stm32cubemx_utils/microros_static_library/libmicroros/libmicroros.a
C_INCLUDES += -Imicro_ros_stm32cubemx_utils/microros_static_library/libmicroros/microros_include

# Add micro-ROS utils
C_SOURCES += micro_ros_stm32cubemx_utils/extra_sources/custom_memory_manager.c
C_SOURCES += micro_ros_stm32cubemx_utils/extra_sources/microros_allocators.c
C_SOURCES += micro_ros_stm32cubemx_utils/extra_sources/microros_time.c

# Set here the custom transport implementation
C_SOURCES += micro_ros_stm32cubemx_utils/extra_sources/microros_transports/dma_transport.c

print_cflags:
   @echo $(CFLAGS)

【运行在freertos上的microros 任何stm32平台】,stm32,嵌入式硬件,单片机
最好按照cubemx语法规则放入注释之间,这样在cubemx软件新添配置后代码不会被覆盖

/* USER CODE BEGIN PM */

/* USER CODE END PM */

将以下头文件复制到freertos.c文件中

#include "usart.h"
#include <rcl/rcl.h>
#include <rcl/error_handling.h>
#include <rclc/rclc.h>
#include <rclc/executor.h>
#include <uxr/client/transport.h>
#include <rmw_microxrcedds_c/config.h>
#include <rmw_microros/rmw_microros.h>
#include <std_msgs/msg/int32.h>
bool cubemx_transport_open(struct uxrCustomTransport * transport);
bool cubemx_transport_close(struct uxrCustomTransport * transport);
size_t cubemx_transport_write(struct uxrCustomTransport* transport, const uint8_t * buf, size_t len, uint8_t * err);
size_t cubemx_transport_read(struct uxrCustomTransport* transport, uint8_t* buf, size_t len, int timeout, uint8_t* err);

void * microros_allocate(size_t size, void * state);
void microros_deallocate(void * pointer, void * state);
void * microros_reallocate(void * pointer, size_t size, void * state);
void * microros_zero_allocate(size_t number_of_elements, size_t size_of_element, void * state);

再将StartDefaultTask()函数中的内容替换为以下内容

void StartDefaultTask(void *argument)
{
    /* USER CODE BEGIN StartDefaultTask */
    /* Infinite loop */
    // micro-ROS configuration

    rmw_uros_set_custom_transport(
      true,
      (void *) &huart1,
      cubemx_transport_open,
      cubemx_transport_close,
      cubemx_transport_write,
      cubemx_transport_read);

    rcl_allocator_t freeRTOS_allocator = rcutils_get_zero_initialized_allocator();
    freeRTOS_allocator.allocate = microros_allocate;
    freeRTOS_allocator.deallocate = microros_deallocate;
    freeRTOS_allocator.reallocate = microros_reallocate;
    freeRTOS_allocator.zero_allocate =  microros_zero_allocate;

    if (!rcutils_set_default_allocator(&freeRTOS_allocator)) {
        printf("Error on default allocators (line %d)\n", __LINE__);
    }

    // micro-ROS app

    rcl_publisher_t publisher;
    std_msgs__msg__Int32 msg;
    rclc_support_t support;
    rcl_allocator_t allocator;
    rcl_node_t node;

    allocator = rcl_get_default_allocator();

    //create init_options
    rclc_support_init(&support, 0, NULL, &allocator);

    // create node
    rclc_node_init_default(&node, "cubemx_node", "", &support);

    // create publisher
    rclc_publisher_init_default(
      &publisher,
      &node,
      ROSIDL_GET_MSG_TYPE_SUPPORT(std_msgs, msg, Int32),
      "cubemx_publisher");

    msg.data = 0;

    for(;;)
    {
      rcl_ret_t ret = rcl_publish(&publisher, &msg, NULL);
      if (ret != RCL_RET_OK)
      {
        printf("Error publishing (line %d)\n", __LINE__);
      }

      msg.data++;
      osDelay(10);
    }
    /* USER CODE END StartDefaultTask */
}

添加syscalls.c:
在工程目录的core/src目录下新建syscalls.c文件,并复制以下内容到新建文件中

/**
*****************************************************************************
**
**  File        : syscalls.c
**
**  Author        : Auto-generated by System workbench for STM32
**
**  Abstract    : System Workbench Minimal System calls file
**
**                   For more information about which c-functions
**                need which of these lowlevel functions
**                please consult the Newlib libc-manual
**
**  Target      : STMicroelectronics STM32
**
**  Distribution: The file is distributed “as is,” without any warranty
**                of any kind.
**
*****************************************************************************
** @attention
**
** <h2><center>&copy; COPYRIGHT(c) 2019 STMicroelectronics</center></h2>
**
** Redistribution and use in source and binary forms, with or without modification,
** are permitted provided that the following conditions are met:
**   1. Redistributions of source code must retain the above copyright notice,
**      this list of conditions and the following disclaimer.
**   2. Redistributions in binary form must reproduce the above copyright notice,
**      this list of conditions and the following disclaimer in the documentation
**      and/or other materials provided with the distribution.
**   3. Neither the name of STMicroelectronics nor the names of its contributors
**      may be used to endorse or promote products derived from this software
**      without specific prior written permission.
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
**
*****************************************************************************
*/

// the code was modified by Fynn Boyer

/* Includes */
#include <sys/stat.h>
#include <stdlib.h>
#include <errno.h>
#include <stdio.h>
#include <signal.h>
#include <time.h>
#include <sys/time.h>
#include <sys/times.h>


/* Variables */
//#undef errno
extern int errno;
extern int __io_putchar(int ch) __attribute__((weak));
extern int __io_getchar(void) __attribute__((weak));

register char * stack_ptr asm("sp");

char *__env[1] = { 0 };
char **environ = __env;

extern char _estack;  // see ld file
extern char _Min_Stack_Size;  // see ld file

/* Functions */
void initialise_monitor_handles()
{
}

int _getpid(void)
{
    return 1;
}

int _kill(int pid, int sig)
{
    errno = EINVAL;
    return -1;
}

void _exit (int status)
{
    _kill(status, -1);
    while (1) {}        /* Make sure we hang here */
}

__attribute__((weak)) int _read(int file, char *ptr, int len)
{
    int DataIdx;

    for (DataIdx = 0; DataIdx < len; DataIdx++)
    {
        *ptr++ = __io_getchar();
    }

    return len;
}

__attribute__((weak)) int _write(int file, char *ptr, int len)
{
    int DataIdx;

    for (DataIdx = 0; DataIdx < len; DataIdx++)
    {
        __io_putchar(*ptr++);
    }
    return len;
}

caddr_t _sbrk(int incr) {
    extern char __heap_start__ asm("end");  // Defined by the linker.
    static char *heap_end;
    char *prev_heap_end;

    if (heap_end == NULL) heap_end = &__heap_start__;

    prev_heap_end = heap_end;

    if (heap_end + incr > &_estack - _Min_Stack_Size) {
        __asm("BKPT #0\n");
        errno = ENOMEM;
        return (caddr_t)-1;

    }

    heap_end += incr;
    return (caddr_t)prev_heap_end;

}

int _close(int file)
{
    return -1;
}


int _fstat(int file, struct stat *st)
{
    st->st_mode = S_IFCHR;
    return 0;
}

int _isatty(int file)
{
    return 1;
}

int _lseek(int file, int ptr, int dir)
{
    return 0;
}

int _open(char *path, int flags, ...)
{
    /* Pretend like we always fail */
    return -1;
}

int _wait(int *status)
{
    errno = ECHILD;
    return -1;
}

int _unlink(char *name)
{
    errno = ENOENT;
    return -1;
}

int _times(struct tms *buf)
{
    return -1;
}

int _stat(char *file, struct stat *st)
{
    st->st_mode = S_IFCHR;
    return 0;
}

int _link(char *old, char *new)
{
    errno = EMLINK;
    return -1;
}

int _fork(void)
{
    errno = EAGAIN;
    return -1;
}

int _execve(char *name, char **argv, char **env)
{
    errno = ENOMEM;
    return -1;
}

再编辑makefile文件,加入syscalls.c文件路径

######################################
source
######################################
C sources
下加入

Core/Src/syscalls.c \

最后编译即可
【运行在freertos上的microros 任何stm32平台】,stm32,嵌入式硬件,单片机
最后下载固件到开发板上即可。

3.运行!

1.将agent功能包上传到linux中(linux需安装ros2系统,版本为foxy)
2.最好编译一下,source功能包后运行以下命令

ros2 run micro_ros_agent micro_ros_agent serial -b 115200 --dev /dev/ttyUSB0

其中ttyUSB0要根据开发板连接的代号来修改
注意 一定要先运行上述命令后再连接开发板
效果如下
【运行在freertos上的microros 任何stm32平台】,stm32,嵌入式硬件,单片机
出现以下情况后连接开发板,会出现以下情况
【运行在freertos上的microros 任何stm32平台】,stm32,嵌入式硬件,单片机
说明开发板与ros2连接成功
再运行`

ros2 topic echo /cubemx_publisher

可查看microros发布的信息
如图
【运行在freertos上的microros 任何stm32平台】,stm32,嵌入式硬件,单片机
运行以下命令 可查看节点信息

rqt_graph

【运行在freertos上的microros 任何stm32平台】,stm32,嵌入式硬件,单片机
说明stm32f103的节点已启动!文章来源地址https://www.toymoban.com/news/detail-840574.html

到了这里,关于【运行在freertos上的microros 任何stm32平台】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [嵌入式软件][启蒙篇] 搭建在线仿真平台(STM32)

    进入官方,进行注册: 在线仿真地址 ① 新建项目 ② 搭建一个电路 ③ 用STM32F103搭建一个简单电路 ④ 进入编码界面 ⑤ 编译,并进行仿真。 红框是必看文档,新手建议先看中文数据手册,不用看太多,可以边学边看。 至此,环境搭建完毕,后面将在这个平台教学。 在线学

    2024年01月23日
    浏览(31)
  • 嵌入式常用术语与AHL-STM32L431运行示例

    1.1 与硬件相关的术语 1. 封装(Package) 2. 印制电路板(Printed Circuit Board,PCB) 3. 动态可读写随机存储器(Dynamic Random Access Memory,DRAM) 4. 静态可读写随机存储器(Static Random Access Memory,SRAM) 5. 只读存储器(Read Only Memory,ROM) 6. 闪存存储器(Flash Memory) 7. 模拟量(Analog Signal) 

    2024年04月14日
    浏览(34)
  • 嵌入式系统专业术语以及AHL-STM32L431运行示例程序

    目录 一、嵌入式术语 1.1 与硬件相关的术语 1.2 与通信相关的术语 1.3 与功能模块相关的术语 二、运行示例程序,并得出结论 1.1 与硬件相关的术语 封装(Package,PKG)   封装是指将集成电路芯片封装在外部包装中以保护芯片并便于连接到电路板上。不同类型的封装可以影响芯

    2024年04月09日
    浏览(29)
  • [嵌入式软件][启蒙篇][仿真平台] STM32F103实现串口输出输入、ADC采集

    上一篇:[嵌入式软件][启蒙篇][仿真平台] STM32F103实现LED、按键 学C语言时,使用的printf()函数,就是通过串口打印出来的。 跟外部器件通信,比如GPS模块、蓝牙模块、wifi模块; 两个开发板之间通信,制定私有协议。 PC电脑通信,使用上位机显示数据或控制下位机。 操作:打

    2024年01月22日
    浏览(49)
  • 基于STM32的实时操作系统FreeRTOS移植教程(手动移植)_stm32移植freertos(1)

    直接意识代码: 这是我们大脑最希望的添加代码方式,很显然他是 错的 , 两个任务之间产生了相互的影响 ,使得两个任务都执行错误,这种思想在 裸机开发 中肯定是 错的 ,但是在我们的 RTOS 中他就可以是 对的 。 任务型代码: 这是 独立的两个任务内容 ,我们只需要把

    2024年04月10日
    浏览(88)
  • 【FreeRTOS】FreeRTOS移植stm32详细步骤介绍

    我在查找FreeRTOS移植的相关教程特别少,所以想非常详细的介绍FreeRTOS移植stm32详细步骤,包括源码的下载,源码介绍,系统移植,代码验证等,每一步都有对应的介绍和解释,希望可以帮助到你们。 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分

    2024年02月08日
    浏览(33)
  • 【GD32/STM32】FreeRtos移植

    ​ (1)下载FreeRtos源码包 ​ FreeRTOS - Market leading RTOS (Real Time Operating System) for embedded systems with Internet of Things extensions ​ (2)将源文件添加至工程 ​ (3)将GD32中的三个中断交由FreeRtos接管 ​ (4)配置管理FreeRTOS.h文件 ​ (5)FreeRtos基本使用方法 源码包结构 1.Demo中存放的

    2024年01月20日
    浏览(29)
  • STM32之FreeRTOS

    目录 FreeRTOS 介绍 什么是 FreeRTOS ? 为什么选择 FreeRTOS ?   FreeRTOS 资料与源码下载 祼机开发与 FreeRTOS  祼机开发: FreeRTOS: FreeRTOS 实现多任务的原理 二、移植 FreeRTOS  手动移植 使用CubeMX快速移植 快速移植流程 一些常见问题 1. Timebase Source 为什么不能设置为 SysTick ? 2. FreeRTO

    2024年02月15日
    浏览(51)
  • STM32FreeRTOS任务通知(STM32cube高效开发)

    1、任务通知可模拟队列和信号量 任务通知是FreeRTOS另外一种进程间通信技术。不需要创建任何中间对象,可以直接从任务向任务或ISR向任务发送通知,传递一个通知值任务通知可以模拟二值信号量、计数信号量、或长度为1的消息队列,使用任务通知,一般效率更高,消耗内

    2024年03月13日
    浏览(37)
  • STM32 FreeRTOS 内存问题

    2024年02月09日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包