摘要:

M32L0xx_HAL_Driver/Src/stm32l0xx_hal_uart_ex.c.obj[67%]Builttargetstm32l051Scanningdependenciesoftargetdrivers[70%]BuildingCobjectsrc/boards/driver/CMakeFiles/drivers.dir/board.c.obj[74%]BuildingCobje

项目在做什么

本项目是为了研究MCU在linux下开发而做的

--build 存放cmake编译生成的文件

--cmake 存放cmake编译时会用到的文件,比如工具链检查、编译选项等

--prj windows下kei工程的工程文件

--src 源码

本项目中大量的CMakeLists.txt的写法参考了LoRa-Node

目前项目已经初步能够运行了

使用的组件

VSCODE -> 程序员使用的文本编辑器

cmake -> 组织编译逻辑

arm-none-eabi --> 编译,生成elf,bin,hex

JLinkGDBServer -> GDB 服务器

cortex-debug -> 用来调试程序

我的环境

jk@jk:~$ sudo lsb_release -a

[sudo] jk 的密码:

No LSB modules are available.

Distributor ID: Ubuntu

Description: Ubuntu 18.04.2 LTS

Release: 18.04

Codename: bionic

至此,需要的组件就罗列清除了,下面来讲下怎么安装

ts.txt文件编写时会互相调用,显得不整洁感谢大家,有问题欢迎大家指正摘要  在常见的媒体播放器中,通常可以看到快进,快退,慢放等功能,这部分功能被称为“特技模式(TrickMode)&

组件安装

VSCODE

官网瞎下载安装即可,每什么可讲的,记得安装最新版

ject_get(data->pipeline,"video-sink",&data->video_sink,NULL);}gst_element_send_event(data-

CMake(需要>3.6)

jk@jk:~$ cmake -version

cmake version 3.10.2

CMake suite maintained and supported by Kitware (kitware.com/cmake).

安装方法:

t;rate>0){seek_event=gst_event_new_seek(data->rate,GST_FORMAT_TIME,GST_SEEK_FLAG_FLUSH|GST_SEE

Ubuntu 16.04/ Linux Mint 18: Since the official repository version is too old, one can use e.g. PPA

Linux Arch: pacman -S cmake

arm-none-eabi

GNU ARM-Toolchain

GNU/Linux:

Ubuntu 16.04/ Linux Mint 18: Since the official repository version is too old, one can use e.g. PPA

Ubuntu 18.04: the toolchain has been updated but there is a bug with libnewlib causing the linker to fail. sudo apt install gcc-arm-none-eabi

Linux Arch: pacman -S arm-none-eabi-gcc arm-none-eabi-newlib

JLinkGDBServer

jk@jk:~$ JLinkGDBServer -version

SEGGER J-Link GDB Server V6.48b Command Line Version

JLinkARM.dll V6.48b (DLL compiled Aug 2 2019 10:20:19)

我下载的是deb格式,使用dpkg -i安装即可

,8倍等倍速称为快进,慢放则是播放速率的绝对值小于1倍速,当播放速率小于0时,则进行倒放。在GStreamer中,我们通过seek与step事件来控制Element的播放速率及区域。Step事件允许跳

cortex-debug

VSCODE 里面搜索cortex-debug 安装即可

playbackspeed,"s"todecreaseplaybackspeed

"""D"totoggleplaybackdirection

"""N'

至此,安装就完成了

--CheckforworkingCXXcompiler:/home/jk/cross-tool/gcc-arm-none-eabi-8-2019-q3-update/bin/arm-none-eab

思路

首先,我们来看main函数

uildingCobjectsrc/boards/driver/CMakeFiles/drivers.dir/stm32l0xx_hal_msp.c.obj[93%]BuildingCobjectsr

/**

* Main application entry point.

*/

int main( void )

{

board_init();

uart1.rx_complete_callback = uartCallback;

while(1)

{

HAL_UART_SendBytes((uint8_t*)"hello world

",sizeof("hello world

"));

DelayMs(5000);

}

}

这个程序就是将硬件初始化,然后5s打印一次"Hello World

"

这里在修改rate后,调用send_seek_event实现真正的处理。/*Sendseekeventtochangerate*/staticvoidsend_seek_event(CustomDat

也就是说这个程序主要分为三个部分:

bj[38%]BuildingCobjectsrc/boards/stm32/CMakeFiles/stm32l051.dir/mcu/stm32/STM32L0xx_HAL_Driver/Src/s

main

驱动

MCU HAL 库

我们来看一下源码结构,也可以得出结论

tel_trailer-480p.webm",NULL);/*Addakeyboardwatchsowegetnotifiedofkeystrokes*/#ifdefG_OS_WIN32io_stdi

jk@jk:~/programe/stm32-linux-cmake$ tree -d -L 2 src

src

├── apps

└── boards

├── driver

└── stm32

其中:

res--DetectingCXXcompilefeatures-doneLinkerscript:/home/jk/programe/stm32-linux-cmake/src/boards/stm

apps中存放的就是main.c文件

Processkeyboardinput*/staticgbooleanhandle_keyboard(GIOChannel*source,GIOConditioncond,CustomData*da

boards中存放的是硬件部分

头文件找不到时就无法调用指定函数将.c文件添加到指定target的方法,我这里用了两种,两种方式都可以达到一样的效果一个个添加list(APPEND${PROJECT_NAME}_SOURCES&qu

boards.driver存放的是硬件的驱动

u/stm32/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_pwr_ex.c.obj[48%]BuildingCobjectsrc/boards/stm32/CMak

boards.stm32中存放的就是stm32的HAL库的代码

t的写法参考了LoRa-Node目前项目已经初步能够运行了使用的组件VSCODE->程序员使用的文本编辑器cmake->组织编译逻辑arm-none-eabi-->编译,生成elf,

所以,我的思路是:

rties.json(用于编写,阅读代码)此处我使用的是JLinkGDBServer,是因为之前使用openocd进行调试时总是出现问题,而用JLinkGDBServer则没发现什么问题launch.

app/boards.driver/boards.stm32这三部分分别生成三个target,最后由这三个target生成exe

实现

AS WE KNOWN

编译需要指定.c文件,编译.c文件时由于多函数跨文件调用是通过头文件进行的,所以需要找寻头文件,当头文件找不到时就无法调用指定函数

TYPE_SET,position,GST_SEEK_TYPE_END,0);}else{seek_event=gst_event_new_seek(data->rate,GST_FORMAT_

将.c文件添加到指定target的方法,我这里用了两种,两种方式都可以达到一样的效果

]BuildingCobjectsrc/boards/stm32/CMakeFiles/stm32l051.dir/mcu/stm32/STM32L0xx_HAL_Driver/Src/stm32l0

一个个添加

eresources*/g_main_loop_unref(data.loop);g_io_channel_unref(io_stdin);gst_element_set_state(data.pip

list(APPEND ${PROJECT_NAME}_SOURCES

"${CMAKE_CURRENT_SOURCE_DIR}/main.c"

)

添加指定文件夹下的所有c文件

les/stm32l051.dir/cmsis/arm-gcc/startup_stm32l051xx.s.obj[9%]BuildingCobjectsrc/boards/stm32/CMakeFi

file(GLOB ${PROJECT_NAME}_SOURCES "${CMAKE_CURRENT_LIST_DIR}/*.c")

将头文件路径添加倒target路径,是通过cmake的target_include_directories()方法,其中,我们可以通过${CMAKE_CURRENT_SOURCE_DIR},直接添加目录,但有时候,我们需要添加别的target的头文件,此时可以用表达式去获取target的头文件,比如

d_seek_event(data);break;case"n":if(data->video_sink==NULL){/*Ifwehavenotdoneso,obtainthe

1. $

通过这个表达式可以获取到在drivers这个target中添加的头文件

好分别的CMakeLists.txt我们分别将三个target命名为app-->project(app)drivers-->project(drivers)stm32l051-->p

CMake的用法还有很多,太灵活了,我这写的也只是冰山一角,后面还要继续努力

m32/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_spi.c.obj[64%]BuildingCobjectsrc/boards/stm32/CMakeFiles/

### 干活

nfig--cflags--libsgstreamer-1.0`源码分析  本例中,Pipeline的创建与其他示例相同,通过playbin播放文件,采用GLib的I/O接口来处理键盘输入。/*Pro

编译程序

在项目的根目录建立CMakeLists.txt,将apps,boards.driver,boards.stm32三个subdirectory分别导入,并在这三个文件夹中写好分别的CMakeLists.txt

}switch(g_ascii_tolower(str[0])){case"p":data->playing=!data->playing;gst_element_set_

我们分别将三个target命名为

al_cortex.c.obj[25%]BuildingCobjectsrc/boards/stm32/CMakeFiles/stm32l051.dir/mcu/stm32/STM32L0xx_HAL

app -->project(app)

drivers -->project(drivers)

stm32l051 -->project(stm32l051)

并在其中添加好各自target的.c文件和头文件,具体见源码

ourdatastructure*/memset(&data,0,sizeof(data));/*Printusagemap*/g_print("USAGE:Chooseoneofthefol

ok之后,CMake文件就编写完了

jk/cross-tool/gcc-arm-none-eabi-8-2019-q3-update/bin/arm-none-eabi-gcc--works--DetectingCcompilerABI

我们需要执行

ATE,GST_SEEK_TYPE_SET,position,GST_SEEK_TYPE_END,0);}else{seek_event=gst_event_new_seek(data->rat

mkdir build

cd build

cmake -DCMAKE_TOOLCHAIN_FILE="cmake/toolchain-arm-none-eabi.cmake" ..

PS:

AL_UART_SendBytes((uint8_t*)"helloworld

",sizeof("helloworld

"));DelayMs(5000)

在根目录生成build文件夹,这是为了方便我们管理,后续如果要删除编译的产物,直接删除build文件夹即可,也可以防止编译的产物污染代码

Makefile生成成功提示如下:

jk@jk:~/programe/stm32-linux-cmake$ ./configure

-- The C compiler identification is GNU 8.3.1

-- The CXX compiler identification is GNU 8.3.1

-- Check for working C compiler: /home/jk/cross-tool/gcc-arm-none-eabi-8-2019-q3-update/bin/arm-none-eabi-gcc

-- Check for working C compiler: /home/jk/cross-tool/gcc-arm-none-eabi-8-2019-q3-update/bin/arm-none-eabi-gcc -- works

-- Detecting C compiler ABI info

-- Detecting C compiler ABI info - done

-- Detecting C compile features

-- Detecting C compile features - done

-- Check for working CXX compiler: /home/jk/cross-tool/gcc-arm-none-eabi-8-2019-q3-update/bin/arm-none-eabi-g++

-- Check for working CXX compiler: /home/jk/cross-tool/gcc-arm-none-eabi-8-2019-q3-update/bin/arm-none-eabi-g++ -- works

-- Detecting CXX compiler ABI info

-- Detecting CXX compiler ABI info - done

-- Detecting CXX compile features

-- Detecting CXX compile features - done

Linker script: /home/jk/programe/stm32-linux-cmake/src/boards/stm32/cmsis/arm-gcc/stm32l051xx_flash.ld

-- The ASM compiler identification is GNU

-- Found assembler: /home/jk/cross-tool/gcc-arm-none-eabi-8-2019-q3-update/bin/arm-none-eabi-gcc

-- Configuring done

-- Generating done

-- Build files have been written to: /home/jk/programe/stm32-linux-cmake/build

执行make,编译程序

播放速率(此速率必须大于0)。Seek事件允许跳转到播放文件中的的任何位置,并且播放速率可以大于0或小于0.  在播放时间控制中,我们使用gst_element_seek_simple来快速的跳转到指

jk@jk:~/programe/stm32-linux-cmake/build$ make

Scanning dependencies of target app

[ 3%] Building C object src/apps/CMakeFiles/app.dir/main.c.obj

[ 3%] Built target app

Scanning dependencies of target stm32l051

[ 6%] Building ASM object src/boards/stm32/CMakeFiles/stm32l051.dir/cmsis/arm-gcc/startup_stm32l051xx.s.obj

[ 9%] Building C object src/boards/stm32/CMakeFiles/stm32l051.dir/cmsis/system_stm32l0xx.c.obj

[ 12%] Building C object src/boards/stm32/CMakeFiles/stm32l051.dir/mcu/stm32/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal.c.obj

[ 16%] Building C object src/boards/stm32/CMakeFiles/stm32l051.dir/mcu/stm32/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_adc.c.obj

[ 19%] Building C object src/boards/stm32/CMakeFiles/stm32l051.dir/mcu/stm32/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_adc_ex.c.obj

[ 22%] Building C object src/boards/stm32/CMakeFiles/stm32l051.dir/mcu/stm32/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_cortex.c.obj

[ 25%] Building C object src/boards/stm32/CMakeFiles/stm32l051.dir/mcu/stm32/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_dma.c.obj

[ 29%] Building C object src/boards/stm32/CMakeFiles/stm32l051.dir/mcu/stm32/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_flash.c.obj

[ 32%] Building C object src/boards/stm32/CMakeFiles/stm32l051.dir/mcu/stm32/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_flash_ex.c.obj

[ 35%] Building C object src/boards/stm32/CMakeFiles/stm32l051.dir/mcu/stm32/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_gpio.c.obj

[ 38%] Building C object src/boards/stm32/CMakeFiles/stm32l051.dir/mcu/stm32/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_i2c.c.obj

[ 41%] Building C object src/boards/stm32/CMakeFiles/stm32l051.dir/mcu/stm32/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_pwr.c.obj

[ 45%] Building C object src/boards/stm32/CMakeFiles/stm32l051.dir/mcu/stm32/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_pwr_ex.c.obj

[ 48%] Building C object src/boards/stm32/CMakeFiles/stm32l051.dir/mcu/stm32/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_rcc.c.obj

[ 51%] Building C object src/boards/stm32/CMakeFiles/stm32l051.dir/mcu/stm32/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_rcc_ex.c.obj

[ 54%] Building C object src/boards/stm32/CMakeFiles/stm32l051.dir/mcu/stm32/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_rtc.c.obj

[ 58%] Building C object src/boards/stm32/CMakeFiles/stm32l051.dir/mcu/stm32/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_rtc_ex.c.obj

[ 61%] Building C object src/boards/stm32/CMakeFiles/stm32l051.dir/mcu/stm32/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_spi.c.obj

[ 64%] Building C object src/boards/stm32/CMakeFiles/stm32l051.dir/mcu/stm32/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_uart.c.obj

[ 67%] Building C object src/boards/stm32/CMakeFiles/stm32l051.dir/mcu/stm32/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_uart_ex.c.obj

[ 67%] Built target stm32l051

Scanning dependencies of target drivers

[ 70%] Building C object src/boards/driver/CMakeFiles/drivers.dir/board.c.obj

[ 74%] Building C object src/boards/driver/CMakeFiles/drivers.dir/delay.c.obj

[ 77%] Building C object src/boards/driver/CMakeFiles/drivers.dir/gpio-board.c.obj

[ 80%] Building C object src/boards/driver/CMakeFiles/drivers.dir/gpio.c.obj

[ 83%] Building C object src/boards/driver/CMakeFiles/drivers.dir/key_board.c.obj

[ 87%] Building C object src/boards/driver/CMakeFiles/drivers.dir/led_board.c.obj

[ 90%] Building C object src/boards/driver/CMakeFiles/drivers.dir/stm32l0xx_hal_msp.c.obj

[ 93%] Building C object src/boards/driver/CMakeFiles/drivers.dir/stm32l0xx_it.c.obj

[ 96%] Building C object src/boards/driver/CMakeFiles/drivers.dir/uart_board.c.obj

[ 96%] Built target drivers

Scanning dependencies of target arm_minisys

[100%] Linking C executable arm_minisys

text data bss dec hex filename

14988 12 400 15400 3c28 arm_minisys

[100%] Built target arm_minisys

Scanning dependencies of target arm_minisys.hex

[100%] Built target arm_minisys.hex

Scanning dependencies of target arm_minisys.bin

[100%] Built target arm_minisys.bin

至此,程序编译完成

gst_element_send_event()发送到sink改变速率。如何通过gst_event_new_step()实现单帧播放。 引用https://gstreamer.freedes

配置VSCODE

配置launch.json (应以调试)

配置c_cpp_properties.json(用于编写,阅读代码)

此处我使用的是JLinkGDBServer,是因为之前使用openocd进行调试时总是出现问题,而用JLinkGDBServer则没发现什么问题

ver/CMakeFiles/drivers.dir/stm32l0xx_it.c.obj[96%]BuildingCobjectsrc/boards/driver/CMakeFiles/driver

launch.json

不讲了,自己看配置文件吧

64position;GstEvent*seek_event;/*Obtainthecurrentposition,neededfortheseekevent*/if(!gst_element_que

c_cpp_properties.json

之前没有仔细配置时,总是在代码编辑器的右边出现红色的错误提示,很是难受,配完之后,这些错误提示都消失了,就舒服了。

_i2c.c.obj[41%]BuildingCobjectsrc/boards/stm32/CMakeFiles/stm32l051.dir/mcu/stm32/STM32L0xx_HAL_Driv

下面我讲一下其中重的部分:

el_win32_new_fd(fileno(stdin));#elseio_stdin=g_io_channel_unix_new(fileno(stdin));#endifg_io_add_wat

includePath,这个下面一定要靶所有的头文件的路径都包含进去,不然找不到头文件,就会出现波浪线的错误提示了,可以使用**的用法,来将目录下的所有文件都导入

-gcc/stm32l051xx_flash.ld--TheASMcompileridentificationisGNU--Foundassembler:/home/jk/cross-tool/gcc

"includePath": [

"${workspaceFolder}/src/**",

"/home/jk/cross-tool/gcc-arm-none-eabi-8-2019-q3-update/arm-none-eabi/include/**"

],

defines,需要把程序中使用的宏添加到此处,否则编辑器对预编译宏做的代码开关也是没法正确识别,例如:

r=NULL;if(g_io_channel_read_line(source,&str,NULL,NULL,NULL)!=G_IO_STATUS_NORMAL){returnTRUE;}sw

"defines": [

"STM32L051xx",

"USE_HAL_DRIVER"

],

compilerPath,这个填写正确的gcc路径,否则也是有奇奇怪怪的错误

URRENT_SOURCE_DIR}/main.c")添加指定文件夹下的所有c文件file(GLOB${PROJECT_NAME}_SOURCES"${CMAKE_CURRENT_

最后的注意事项

当CMake config/generate失败的时候,可以尝试将build文件夹删除,重新进行,可能会成功

因为此处我是通过传递工具链文件的方式来传递工具链给CMake的,指令有些长,且难记,为了方便,我将指令做成了config文件,在${ROOT}下有个config文件,这样,后面只要执行./config就可以生成Makefile文件了

代码结构要清晰,要尽量接耦,否则CMakeLists.txt文件编写时会互相调用,显得不整洁

感谢大家,有问题欢迎大家指正

stm32 vscode 编译_linux 下 VSCODE 使用CMake编译STM32程序相关推荐

  1. 【转载】【VSCode】Windows下VSCode编译调试c/c++

    转载自:http://blog.csdn.net/c_duoduo/article/details/51615381 懒得自己配置或自己配置出现不明问题的朋友可以点这里:  [VSCode]Windo ...

  2. 【VSCode】Windows下VSCode编译调试c/c++【更新】

    版权声明:本文为博主原创文章,转载请注明出处. --------– 2017.06.10 更新--------- 便携版已更新,点此获取便携版 用于cpptools插件的配置文件更新 更新的launc ...

  3. 在ubuntu下使用cmake进行opencv的配置和Windows下进行使用cmake编译源代码比较,opencv3进行g++例子程序编译、动态库的制作

    1.首先安装的是cmake软件,使用指令: apt-get install cmake 接着查看版本,测试是否安装成功: root@emouse:/home# cmake --version cmak ...

  4. linux pjsip 编译_Linux下移植pjsip使用QT开发

    Linux下移植pjsip,使用QT开发 1.移植pjsip env:fedora14 arm-linuc-gcc:gcc version 4.5.1 (ctng-1.8.1-FA) #./confi ...

  5. Ubuntu下正确使用cmake编译安装glog

    1,安装gflags git clone https://github.com/gflags/gflags.git cd gflags mkdir build && cd build ...

  6. neon浮点运算_Linux下VFP NEON浮点编译

    http://blog.csdn.net/liujia2100/article/details/27236477 NEON:SIMD(Single Instruction Multiple Data ...

  7. php 重新编译_linux下为php添加GD库(重新编译php)

    一.下载 二.安装 1.安装zlib tar zxvf zlib-1.2.2.tar.gz cd zlib-1.2.2 ./configure make make install 2.安装libpng ...

  8. 关于arm-none-linux-gnueabi-4.4.3编译环境下,lib1funs.S编译报错的处理

    原始报错信息: Krj@VM:~/soc_workspace/1stQuarter_BarBoard/15_NandFlash/NandFlash_codeTest$ make cleanDepend ...

  9. java socket 抓包_linux下用socket的抓包程序

    void die(char *why, int n) { perror(why); exit(n); } int do_promisc(char *nif, int sock ) { struct i ...

最新文章

  1. ZooKeeper典型应用场景一览
  2. 关于数据挖掘的几篇文章(1)
  3. java越权发送邮件_水平越权的常见解决方法
  4. c语言防止缓冲区数据作为有效字符被读入
  5. GATT之Device information Service
  6. Deeplab 在Qt Creator下编译报错undefined reference to Mat_xxx
  7. xcode多工程联编 - 详细教程
  8. Oracle分组排序查询
  9. 基于CSE的微服务工程实践-多微服务框架演进
  10. Ubuntu10.10 Server+Nginx+Django+Postgresql安装步骤
  11. ARM嵌入式系统开发之接收函数的实现
  12. Python的Numpy库下载及安装
  13. win10任务栏太宽而且调不了_win10任务栏变宽了怎么恢复原来的_win10任务栏变宽拉不下去怎么办-爱纯净...
  14. 浅谈链表的构建,next到底是什么
  15. 惠州生物实验室建设宝典
  16. 华为AC6605对接OpenPortal网络准入认证计费系统实现Mac快速认证+Portal认证
  17. PiXYZStudio:Revit 模型轻量化
  18. 次世代游戏建模技巧全解之制作高模篇
  19. 综述类_网络入侵检测技术综述
  20. 交通灯c51汇编语言,单片机交通灯实验汇编语言程序

热门文章

  1. Web浏览器(B/S)播放插件
  2. Windows Docker 安装
  3. Android工具类获取上下文对象
  4. Map集合中的方法(添加、删除、判断、获取)
  5. 计算机用电,37℃,37℃,37℃……超长高温天气下,这些家庭安全用电知识你要知道!...
  6. Dynamsoft Barcode Reader教程:HTML5中的移动QR码扫描仪
  7. 思科交换机与华为交换机生成树兼容性问题
  8. Nexus 搭建及基础使用
  9. 虚拟现实在医学领域应用
  10. IQC跳捡 T-SQL