如何在任何STM32上面安装micro_ros(貌似这个文章里面已经没有什么可以继续阻挡我的了,我有gitee和docker,虽然docker其实用不着)

这篇具有很好参考价值的文章主要介绍了如何在任何STM32上面安装micro_ros(貌似这个文章里面已经没有什么可以继续阻挡我的了,我有gitee和docker,虽然docker其实用不着)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

JMP推荐跳转到此篇文章==>STM32CubeMX+micro_ros_stm32cubemx_utils库-CSDN博客

就我知道的:micro-ros只能在特定的昂贵的开发板上面运行,但是偶然发现了这个文章,似乎提供了一个全新的方式来在ros2和单片机之间通讯,如果能够这样肯定也能够提高效率,但即使不行,使用串口库也应该比较简单。

GitHub - lFatality/stm32_micro_ros_setup: Example of how to setup micro-ROS on any STM32 microcontroller

README.md

Setting up micro-ROS on any STM32 microcontroller

This repository gives an example of how to set up micro-ROS on any STM32 microcontroller. For this repository an STM32F429ZI was chosen but you are free to choose another one.

You can also find the instructions in video form here: https://youtu.be/xbWaHARjSmk

Goal

If you follow all steps in the tutorial you should have an STM32 microcontroller with a micro-ROS publisher that transmits messages via UART to your PC running ROS 2. Here you can receive the messages via ros2 topic echo.

Steps

In the following the required steps to achieve the goal are presented in detail. It will show how to do this for a microcontroller that is not listed as a device directly supported by micro-ROS. (看到没有:即使是不受官方支持的,也可以使用MICRO_ROS,那个官方支持的开发板实在太少,而且太贵,所以我才说成本太高,现在看来有办法降低成本了)If you find that you have problems check out the Troubleshooting section below.(如果有问题请看后面的”Trobleshooting“部分

micro-ROS

1.) Create a new CubeMx project for your micro controller
2.) In System Core -> RCC -> High Speed Clock (HSE) select Crystal/Ceramic Resonator

stm32micro-ros,ros2与STM32通讯,micro_ros与STM32通讯,stm32,ros2
3.) In System Core -> SYS -> Timebase Source select TIM1

stm32micro-ros,ros2与STM32通讯,micro_ros与STM32通讯,stm32,ros2
4.) In Middleware -> FREERTOS -> Interface select CMSIS_V2

stm32micro-ros,ros2与STM32通讯,micro_ros与STM32通讯,stm32,ros2
4.1.) In Middleware -> FREERTOS -> Configuration -> Task and Queues double click the defaultTask and set a stack size of 3000. It has to be greater than 10.000 byte (3000 words * 4 byte = 12.000 byte).F103C8T6有20KB,明明没有超为什么不行?

stm32micro-ros,ros2与STM32通讯,micro_ros与STM32通讯,stm32,ros2

stm32micro-ros,ros2与STM32通讯,micro_ros与STM32通讯,stm32,ros2

 注意了:STM32C8T6在这里好像出了问题:因为这个Stack Size我感觉好像超了

stm32micro-ros,ros2与STM32通讯,micro_ros与STM32通讯,stm32,ros2

如果遇到这个问题需要首先修改堆栈大小:

stm32micro-ros,ros2与STM32通讯,micro_ros与STM32通讯,stm32,ros2

 修改步骤:修改Config parmeters-->Memory management settings---->TOTAL_HEAP_SIZE设置为16000;然后就可以解决这个问题

stm32micro-ros,ros2与STM32通讯,micro_ros与STM32通讯,stm32,ros2

 看吧已经改好了

5.) In Connectivity choose the UART / USART that you want to use.

stm32micro-ros,ros2与STM32通讯,micro_ros与STM32通讯,stm32,ros2
5.1.) In the Uart configuration, go to DMA Settings. Click on the Add button. Click on the Select dropdown and choose both Rx and Tx.

stm32micro-ros,ros2与STM32通讯,micro_ros与STM32通讯,stm32,ros2
5.2.) Click on the Rx DMA you've just created and for Mode choose Circular.

stm32micro-ros,ros2与STM32通讯,micro_ros与STM32通讯,stm32,ros2
5.3.) For the priority of the DMA choose Very high for both Rx and Tx.

stm32micro-ros,ros2与STM32通讯,micro_ros与STM32通讯,stm32,ros2


5.4.) Go to NVIC Settings of the UART and activate the UARTx global interrupt.

stm32micro-ros,ros2与STM32通讯,micro_ros与STM32通讯,stm32,ros2
6.) Set up the Clock Configuration for your micro controller
7.) In Project Manager select a folder where to generate your code
7.1.) In Toolchain / IDE select Makefile(这里有点不一样:平时都选择keil)

stm32micro-ros,ros2与STM32通讯,micro_ros与STM32通讯,stm32,ros2
7.2.) Optional: In Project Manager -> Code Generator select Generate peripheral intitialization as a pair of '.c/.h' files per peripheral
8.) Click on Generate Code
9.) In the root folder of the code you've just generated, clone the following repository (into a subfolder, don't change its name).:

stm32micro-ros,ros2与STM32通讯,micro_ros与STM32通讯,stm32,ros2

git clone https://github.com/micro-ROS/micro_ros_stm32cubemx_utils.git

10.) Make sure you have the right branch for your ROS version checked out 11.) In the Makefile that was generated by CubeMx put the following code snippet after the part where it says 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)

11.)Execute the static library generation tool.(执行“静态库产生”工具软件) Compiler flags will retrieved automatically from your Makefile and user will be prompted to check if they are correct.

Pull and run the following docker (这个docker就是静态库生产工具软件)to generate the micro-ros lib(我现在就卡在这个编译静态micro_lib库的地方,我需要知道怎么样编译micro_lib静态库). Make sure you use the right ROS version (注意这个ros的版本不要搞错了makefile里的版本要搞对,下面这个galactic指的是ros2版本,我的是humble就应该吧galactic改为humble)when you pull / run the docker. This should be executed in the root folder of your project.

stm32micro-ros,ros2与STM32通讯,micro_ros与STM32通讯,stm32,ros2

 #这里的microros/micro_ros_static_library_builder:humble是服务器上面的镜像名称,不是本地存放位置

docker pull microros/micro_ros_static_library_builder:humble

#docker pull命令:从镜像仓库获取镜像;应该就是构建了一个micro_ros的编译环境

#后面3行是一个整体,并且其中的project要修改为存放micro_ros_stm32cubemx_utils文件夹的文件夹其中/project必须是绝对文件位置,不能是以~开头之类的相对位置

docker run -it --rm -v $(pwd):/project --env MICROROS_LIBRARY_FOLDER=micro_ros_stm32cubemx_utils/microros_static_library microros/micro_ros_static_library_builder:humble

解读0:这个-v $(pwd): /project 应该就是把本地的$(pwd)文件夹映射为容器里面的/project文件夹。

解读1:上边这个--env 即environment,指定环境变量microros_library_folder=静态库的地址为micro_ros_stm32cubemx_utils/microros_static_library.

解读2:microros/micro_ros_static_library_builder:humble是本次运行的软件或者叫镜像什么的。

这个句子的格式应该就是docker run --env 指定环境变量X=123 运行的软件名称

最基本的启动命令(从image创建一个container并启动):docker run -d <image-name>

-v:本地host的文件(文件夹)映射到容器内的文件(文件夹)

想起的-v参数是:-v [[host-dir:] container-dir

-v的第一个参数是host-dir,这个参数是可选参数,如果没设置,docker会在host主机中创建该文件夹

第二个参数是container-dir,这个参数是必选参数,是容器内部的文件夹

我已经安装了ros2和Ubuntu所以我就不用docker了上边这个很可能就是编译静态库的的过程,我替换为以下步骤:

#这个地方的网址可能要改一下,另外这条命令中src/micro_ros_setup表示在本地建立2个文件夹,一个是src,另外在src内再建立一个micro_ros_setup文件夹,最后把远程复制的文件放到这个里面来
git clone -b humble https://github.com/micro-ROS/micro_ros_stm32cubemx_utils.git src/micro_ros_stm32cubemx_utils
rosdep update && rosdep install --from-paths src --ignore-src -y
colcon build
#应该就是使用rosdep补全依赖项,然后就使用colcon工具编译这个代码库成为静态库

 上边这个git命令不一定能正确运行,所以可以自己使用浏览器从github下载代码库,然后把文件放到文件夹内。具体说就是下载后的文件夹整个复制到src文件夹内(没有就新建一个src文件夹)

后面这个是对git clone remote_address local_address的一个示范。可看出local_address指定的是存放代码库的文件夹stm32micro-ros,ros2与STM32通讯,micro_ros与STM32通讯,stm32,ros2

12.) If it asks for the CFLAGS, if you can see some, continue. They might look like this:

Found CFLAGS:
-------------
-mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard -DUSE_HAL_DRIVER -DSTM32F429xx -ICore/Inc -IDrivers/STM32F4xx_HAL_Driver/Inc -IDrivers/STM32F4xx_HAL_Driver/Inc/Legacy -IMiddlewares/Third_Party/FreeRTOS/Source/include -IMiddlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS -IMiddlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F -IDrivers/CMSIS/Device/ST/STM32F4xx/Include -IDrivers/CMSIS/Include -IDrivers/CMSIS/Include -Imicro_ros_stm32cubemx_utils/microros_static_library/libmicroros/microros_include -Og -Wall -fdata-sections -ffunction-sections -g -gdwarf-2 -MMD -MP -MFprint_cflags
-------------

If instead the CFLAGS are empty there was likely a mistake. If you get an error about a missing separator in the Makefile, check the line in the Makefile. For me there were 2 similar includes. I deleted one of them.

13.) If you get an error like this during building:

'rcutils' exports library 'dl' which couldn't be found

That's ok and can be ignored.

14.) Go into Core/main.cpp and adjust it so that it's similar to the sample_main.cpp you can find in the micro_ros_stm32cubemx_utils repository we found earlier. The most interesting parts are the following:

#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);
void StartDefaultTask(void *argument)
{
    /* USER CODE BEGIN StartDefaultTask */
    /* Infinite loop */
    // micro-ROS configuration

    rmw_uros_set_custom_transport(
      true,
      (void *) &huart2,
      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 */
}

15.) Open the project in your favorite IDE. In general you should now be able to build and debug your program. To built I used the arm-none-eabi-toolchain. To flash and debug I used openocd. If you can not build check step 15.1.

15.1.) It might be that you can not build yet because of missing syscalls. In that case you might get errors like undefined reference to _kill or undefined reference to _getpid. In that case add a syscalls.c file to your project and also add it to the Makefile so that it will be compiled. You can find an example syscalls.c at the end of this page.

micro-ROS agent

19.) Now you need a micro-ROS agent. It's responsible to create the communication between your embedded controller and the rest of your ROS 2 software. Create a different folder that will be used as a ROS 2 workspace.

20.) Clone the micro_ros_setup repository and build it by executing the following steps from the root of your workspace folder:

source /opt/ros/$ROS_DISTRO/setup.bash
git clone -b $ROS_DISTRO https://github.com/micro-ROS/micro_ros_setup.git src/micro_ros_setup
rosdep update && rosdep install --from-path src --ignore-src -y
colcon build
source install/local_setup.bash

21.) Build the agent packages

ros2 run micro_ros_setup create_agent_ws.sh
ros2 run micro_ros_setup build_agent.sh
source install/local_setup.sh

I got a warning about stderr output when running build_agent.sh (at the end of the build process) but I ignored that. I also had a problem were build_agent.sh complained about being unable to find a package (Package 'micro_ros_agent' specified with --packages-up-to was not found). This was because I didn't follow the steps to build the workspace first correctly (step 20).

22.) Start the micro-ros-agent. For example:

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

serial: for UART use, other options available -b: baudrate --dev: the device to use

To get help with the usage:

ros2 run micro_ros_agent micro_ros_agent --help

23.) In the agent you should see something like this:

[1641665035.090947] info     | TermiosAgentLinux.cpp | init                     | running...             | fd: 3
[1641665035.130109] info     | Root.cpp           | create_client            | create                 | client_key: 0x041835D4, session_id: 0x81
[1641665035.130212] info     | SessionManager.hpp | establish_session        | session established    | client_key: 0x041835D4, address: 0
[1641665035.156038] info     | ProxyClient.cpp    | create_participant       | participant created    | client_key: 0x041835D4, participant_id: 0x000(1)
[1641665035.171020] info     | ProxyClient.cpp    | create_topic             | topic created          | client_key: 0x041835D4, topic_id: 0x000(2), participant_id: 0x000(1)
[1641665035.181034] info     | ProxyClient.cpp    | create_publisher         | publisher created      | client_key: 0x041835D4, publisher_id: 0x000(3), participant_id: 0x000(1)
[1641665035.191347] info     | ProxyClient.cpp    | create_datawriter        | datawriter created     | client_key: 0x041835D4, datawriter_id: 0x000(5), publisher_id: 0x000(3)
[1641665052.957930] info     | SessionManager.hpp | establish_session        | session re-established | client_key: 0x041835D4, address: 0

This is some kind of handshake between the agent and the embedded system. You might have to restart your MCU, the agent should be started first it seems.

If you see something like this instead:

[1641665033.757172] info     | TermiosAgentLinux.cpp | init                     | Serial port not found. | device: /dev/ttyACM0, error 2, waiting for connection...
[1641665034.757430] info     | TermiosAgentLinux.cpp | init                     | Serial port not found. | device: /dev/ttyACM0, error 2, waiting for connection...

You have likely selected the wrong device or your MCU is not connected.

23.) You should now be able to see the messages published by the MCU on ROS2:

ros2 topic echo /cubemx_publisher

The data would look like this:

---
data: 2399
---
data: 2400
---
data: 2401
---
data: 2402
---
data: 2403
---
data: 2404
---

Troubleshooting

Problem 1

When stepping through the code the programs hangs at rclc_support_init.

Solution 1

Be sure that the UART you use when calling rmw_uros_set_custom_transport is the one that you set up for ROS (e.g. with the right DMA settings). Also be aware that the call to this function can take some time (~10 seconds). When running the micro-ROS agent it usually is faster though.

Problem 2

The publishing doesn't work. I go into the error case in the infinite loop of the main task:

rcl_ret_t ret = rcl_publish(&publisher, &msg, NULL);
if (ret != RCL_RET_OK)
{
  printf("Error publishing (line %d)\n", __LINE__); // <-------------------- this is entered
}

In my case I can see some prints on the UART before entering the while loop. There is a lot of random bytes but sometimes I can see XRCE.

Solution 2

You need a running micro-ROS agent. See steps 19.) and following. If you have an agent running but it still doesn't work, look at problem / solution 6.

Problem 3

When trying to flash the board, I get an openocd bug saying something with "free"

Solution 3

Unplug MCU and replug it (power).

Problem 4

When I run the agent and MCU the agent says

fynn@sphalerite:~/main/dev/tests/micro-ros/agent_ws$ ros2 run micro_ros_agent micro_ros_agent serial -b 115200 --dev /dev/ttyACM0
[1643036775.906617] info     | TermiosAgentLinux.cpp | init                     | running...             | fd: 3
[1643036775.906762] info     | Root.cpp           | set_verbose_level        | logger setup           | verbose_level: 4

but nothing else happens and I can't receive my data.

Solution 4 :

Check that your MCU doesn't crash anywhere (e.g. in the syscalls).

Problem 5

I get an error saying that _getpid and _kill are not defined.

Solution 5

You need to define a syscalls.c file and add these function with their functionality. You can find an example of such a file at the end of this page.

Problem 6

When I run the agent and the MCU, the agent says

[1641665035.090947] info     | TermiosAgentLinux.cpp | init                     | running...             | fd: 3
[1641665035.130109] info     | Root.cpp           | create_client            | create                 | client_key: 0x041835D4, session_id: 0x81
[1641665035.130212] info     | SessionManager.hpp | establish_session        | session established    | client_key: 0x041835D4, address: 0

but it's not creating a participant or topic. I can't receive my data.

Solution 6

Check that you don't have another serial program (putty, hterm, gtkterm, ...) connected to your device (at least not to that same UART). Also be sure that your hardware setup is correct, e.g. that you have GND connected between the two nodes when using a UART connection.

Problem 7

If you're using Eclipse: When compiling Eclipse says Error: Program "" not found in PATH

Solution 7

Right click your project -> Properties -> C/C++ Build -> Uncheck "Use default build command" and exchange ${cross_make} with a simple make

Problem 8

If you're using Eclipse:
I get an error that the program "" can not be executed

Solution 8

Right click your project -> Properties -> C/C++ Build: Untick Use default build command. Define Build command as: make

Problem 10

If you're using Eclipse and it says that it can't find the arm-none-eabi-gcc

Solution 10

You need to download and extract the toolchain. You can find it here: Downloads | GNU Arm Embedded Toolchain Downloads – Arm Developer

Then set up your Eclipse to know where it is: Right click your project -> Properties -> MCU -> Arm Toolchains Paths: Toolchain name: xPack GNU Arm Embedded GCC Toolchain folder: path/to/your/arm-none-eabi-toolchain/bin

In the bin folder should be arm-none-eabi-gcc among others.

If it still doesn't work, try just opening the following menu: Right click your project -> Properties -> C/C++ Build -> Settings文章来源地址https://www.toymoban.com/news/detail-834730.html

Example 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;
}

到了这里,关于如何在任何STM32上面安装micro_ros(貌似这个文章里面已经没有什么可以继续阻挡我的了,我有gitee和docker,虽然docker其实用不着)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

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

    `本文主要分享一下如何快速在stm32f103或stm32系列的任意板子上运行microros的具体步骤。(所需要的文件已经生成好了)。 生成的步骤极其踩坑,是一段令人痛苦的回忆。 生成静态链接库的踩坑主要内容就是 所有资源都是外网,需要代理,如果网络不通畅所有的步骤都得重新

    2024年03月16日
    浏览(53)
  • ROS与STM32通信(二)-pyserial

    ROS与STM32通信一般分为两种, STM32上运行ros节点实现通信 使用普通的串口库进行通信,然后以话题方式发布 第一种方式具体实现过程可参考上篇文章ROS与STM32通信-rosserial,上述文章中的收发频率不一致情况,目前还没解决,所以本篇文章采用第二种方式来实现STM32与ROS通信,

    2024年02月12日
    浏览(35)
  • ROS与STM32通信(一)-rosserial

    STM32F103c8t6 OLED(I2C) USB2TTL Stlink 接线 OLED(GPIO模拟I2C) 硬件 引脚 OLEDSCL PA4 OLEDSDA PA5 USART1 硬件 引脚 作用 RX PA9 USART1_TX TX PA10 USART1_RX LED 硬件 引脚 LED0 PC13 LED1 PC15 STM32CubeMX Clion STM32CubeMX配置 SYS-Debug-Serial Wire RCC-HSE-Crystal/Ceramic Resonator PC15-OutPut ,Label为LED0 PC13-OutPut ,Label为LED1 TIM1-Clock

    2024年02月09日
    浏览(36)
  • ROS机器人制作(三)—— ROS上位机与stm32进行串口通信

    总代码在文末,需要完整的工程文件可以私聊(收一点点辛苦费) 首先创建一个功能包,用于发送和接收数据。 注意: 1.功能包依赖: roscpp std_msgs rosserial 2.当有两个c++文件进行编译时可以在功能包下的CMakeLists.txt文件中 第一部分是ROS上位机给stm32发送数据。第二部分是stm

    2024年02月15日
    浏览(58)
  • yocto stm32mp1集成ros

    本章节介绍yocto如何集成ros系统用来作机器人开发。 第一步首先需要下载meta-ros layer,meta-ros的链接如下:https://github.com/ros/meta-ros/tree/master,在我们的yocto源码layers路径下执行如下指令: 下载完成以后如下: 完成以后需要进入到meta-ros里面切换匹配yocto版本的分支,比如我当前

    2024年02月09日
    浏览(30)
  • STM32 使用microros与ROS2通信

    本文主要介绍如何在STM32中使用microros与ROS2进行通信,在ROS1中标准的库是rosserial,在ROS2中则是microros,目前网上的资料也有一部分了,但是都没有提供完整可验证的demo,本文将根据提供的demo一步步给大家进行演示。 1、首先如果你用的不是STM32F4的话,则需要自己去生成 micro_r

    2024年02月08日
    浏览(45)
  • 如何在centos上面安装mpi4py

    参考链接: https://stackoverflow.com/questions/41446426/cannot-install-mpi4py-on-centos-7 https://stackoverflow.com/questions/55129738/centos-7-undefined-symbol-ompi-mpi-logical8 一般来说,直接使用pip安装就可以了: 1.但是在centos上面我遇到了下面的问题: error: Cannot compile MPI programs. Check your configuration!!! 找到的

    2024年02月15日
    浏览(41)
  • 在STM32中实现ROS节点——Rosserial的用法

    本文介绍如何将stm32控制板作为一个单独的ROS节点接入整个机器人ROS系统。 在一个完整的机器人硬件系统中,由于众多传感器接口和实时性的需求,不可避免的需要加入嵌入式控制器,现在的机器人大多使用了分布式ROS系统,这套系统主要基于linux运行,而以stm32为例的大多数

    2023年04月24日
    浏览(26)
  • SLAM从入门到精通(ROS和底盘Stm32的关系)

    【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】         学过Ros的同学,一般对subscribe、publish、话题、服务这些内容都比较熟悉。如果再熟悉一点的话,还会知道slam、move_base、moveit这些框架。再了解多一点的呢,会对框架里面的算法,比如

    2024年02月07日
    浏览(35)
  • 基于STM32F103的树莓派ROS小车——全局路径规划之Dijkstra算法

    Dijkstra Dijkstra算法概念: 基本思想:由近到远把所有点的最短路径算出来。 算法解析:从起点向四周辐射,由近到远一层一层遍历所有的点,直到包含目标点所在层级。然后将所有可行路径进行计算比较,筛选出绝对最佳路径。 优点:最终得到的路径一定是最佳路径。 缺点

    2024年02月15日
    浏览(39)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包