参考——CCS联合CLion调试__开发TI芯片

news2024/9/22 23:31:44

一、简介

        随着电赛临近,有些题必须指定使用TI芯片,那么就不得不学一下CCS。虽然CCS相较于Keil和IAR,显得更现代化一些,但还是没有代码样式代码格式化代码补全等功能。如果你用惯了CLion再用CCS,就会有些许一言难尽,总得来说就是智能了但又没完全智能,比如断点。因此想到了使用CLion来开发TI芯片.

        只不过过程很不顺,最主要的原因在于我使用的芯片是MSPM0G3507,且是launchpad,而OpenOCD上好像又没有相关的配置,最终导致调试TI开发板。想过直接使用GDB,或者换成可以使用JLink的开发板(有空再说),但由于时间有限就不得不找个次替方案,于是就想到了CCS联调CLion

        这里所谓的联调指的是在CLion里面编写代码(包括检测语法错误),在CCS里进行外设初始化、调试等,虽不如最初的构想,但也可以大大降低开发难度。同时,CLionCode with me这个功能,这意味着你和其他人可以联合开发同一个项目。下面配置中最难的步骤在于“删”和配置CMakelists,由于我们使用的TI芯片可能不同,所以这里主要讲方法。

二、联调配置

1,工程创建

①编译器选型

        前面提到,既然要想CCS联调CLion,那么就必须把CCS相关工程配好,在不影响CCS编译的情况下,联调CLion。CCS一共有两个编译工具链,其一为clang,其二为arm-gnu,不过后者需要的版本是9.82,这与CLion用的版本多半不同且CCS需要自己配置arm-gnu工具链。

        所以CCS的工程就选为clang,虽说与CLion用的编译器不同,语法、生成的代码会有些许差异,但是CLion在这里发挥的作用主要是编写,也就不用考虑了(有问题再说)。

②导入工程

        这里选用的是官方实例中的RTOS工程,首先要到官网下载相应的SDK,我使用的芯片是MSPM0G3507,所以就下载了MSPM0的SDKMSPM0-SDK 软件开发套件 (SDK) | 德州仪器 TI.com.cn

        在SDK里,我们需要找到对应工程,它就在【example-rtos-LP_MSPM0G3507-kernel】里。

我们选用最基础的闪灯工程。

         为了后续移植方便,把这个SDK复制到你准备创建的workplace里,我这里的workplace是TI这个目录,Furina是其工程名。

 在CCS里找到对应目录,直接导入即可

然后你就会得到以下目录

 2,准备CLion工程前置工作

①编写CMakelists

        前面提到这个工程名为Furina,那么在里面添加一个CMakelists.txt文件。这里面的编译器选项和链接器选项都是参照官方实例里gcc下的Makefile。这个嘛,就看个人选择,你可以直接使用官方这个makefile,配置相应的Makefile程序也是可以的,这样反而更快。不过由于我将来要尝试使用OpenOCD或者其他什么的调试程序,所以在此就用了最熟悉的cmake。

        如果你想使用makefile(本篇文章省去了具体配置过程,不过过程并不难),那么就而可以直接跳到【3,配置CLion工程】

        照着里面的CFLAGSLFLAGS里的参数(比如-mthumb)把对应的add_compile_optionsadd_link_options也改一下。同时要注意,CFLAGS里有个宏定义-D__MSPM0G3507__,需要添加至add_definitions里。

set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_VERSION 1)
cmake_minimum_required(VERSION 3.28)

#
#set(toolsPath /usr/arm-gnu-toolchain/bin)
#set(CMAKE_C_COMPILER ${toolsPath}/arm-none-eabi-gcc)
#set(CMAKE_CXX_COMPILER ${toolsPath}/arm-none-eabi-g++)
#set(CMAKE_ASM_COMPILER ${toolsPath}/arm-none-eabi-gcc)
#set(CMAKE_AR  ${toolsPath}/arm-none-eabi-ar)
#set(CMAKE_OBJCOPY  ${toolsPath}/arm-none-eabi-objcopy)
#set(CMAKE_OBJDUMP  ${toolsPath}/arm-none-eabi-objdump)

#下面代码是MinGW工具链下的
# specify cross-compilers and tools
set(CMAKE_C_COMPILER arm-none-eabi-gcc)
set(CMAKE_CXX_COMPILER arm-none-eabi-g++)
set(CMAKE_ASM_COMPILER arm-none-eabi-gcc)
set(CMAKE_AR arm-none-eabi-ar)
set(CMAKE_OBJCOPY arm-none-eabi-objcopy)
set(CMAKE_OBJDUMP arm-none-eabi-objdump)
set(SIZE arm-none-eabi-size)

set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)

# project settings
project(blink_led C CXX ASM)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_C_STANDARD 11)

#如果是FreeRTOS,那么下面需要开启,如果是RT-Thread,则需要关闭
#Uncomment for hardware floating point
#add_compile_definitions(ARM_MATH_CM4;ARM_MATH_MATRIX_CHECK;ARM_MATH_ROUNDING)
#add_compile_options(-mfloat-abi=hard -mfpu=fpv4-sp-d16)
#add_link_options(-mfloat-abi=soft -mfpu=fpv4-sp-d16)

#Uncomment for software floating point,要注释
add_compile_options(-mfloat-abi=soft)

#add_compile_options(-mcpu=cortex-m0plus -mthumb -mthumb-interwork)
#add_compile_options(-ffunction-sections -fdata-sections -fno-common -fmessage-length=0)
add_compile_options(-mcpu=cortex-m0plus -march=armv6-m -mthumb -mthumb-interwork)
add_compile_options(-ffunction-sections -fdata-sections -fno-common -fmessage-length=0 -gstrict-dwarf)
# Enable assembler files preprocessing
add_compile_options($<$<COMPILE_LANGUAGE:ASM>:-x$<SEMICOLON>assembler-with-cpp>)


add_link_options(-Wl,-gc-sections,--print-memory-usage,-Map=${PROJECT_BINARY_DIR}/${PROJECT_NAME}.map)
add_link_options(-mcpu=cortex-m0plus -march=armv6-m -mthumb -mthumb-interwork)
add_link_options(-T ${LINKER_SCRIPT})

# uncomment to mitigate c++17 absolute addresses warnings
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-register")


if ("${CMAKE_BUILD_TYPE}" STREQUAL "Release")
    message(STATUS "Maximum optimization for speed")
    add_compile_options(-Ofast)
elseif ("${CMAKE_BUILD_TYPE}" STREQUAL "RelWithDebInfo")
    message(STATUS "Maximum optimization for speed, debug info included")
    add_compile_options(-Ofast -g)
elseif ("${CMAKE_BUILD_TYPE}" STREQUAL "MinSizeRel")
    message(STATUS "Maximum optimization for size")
    add_compile_options(-Os)
else ()
    message(STATUS "Minimal optimization, debug info included")
    add_compile_options(-Og -g)
endif ()

add_definitions(-DDEBUG -D__MSPM0G3507__)

include_directories(
        ticlang/Application

        kernel/freertos/builds/LP_MSPM0G3507/release
        source/third_party/CMSIS/Core/Include
        source/third_party/CMSIS/DSP/Include
        source/third_party/CMSIS/DSP/PrivateInclude
        kernel/freertos/Source/include
        source
        kernel/freertos/Source/portable/GCC/ARM_CM0
        source/ti/posix/gcc

        source/third_party/mcuboot/boot/bootutil/include
)

file(GLOB_RECURSE SOURCES
        "ticlang/Application/*.*"

        "kernel/freertos/builds/LP_MSPM0G3507/release/*.*"
        "kernel/freertos/Source/portable/GCC/ARM_CM0/*.*"
        "kernel/freertos/Source/include/*.*"
        "kernel/freertos/Source/*.*"
        "kernel/freertos/dpl/*.*"

        "source/*.*"
    "syscalls.c"
)
#下面是额外添加的,用于动态代码的分析
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address")

#set(LINKER_SCRIPT ${CMAKE_SOURCE_DIR}/STM32F407VETX_FLASH.ld)
set(LINKER_SCRIPT ${CMAKE_SOURCE_DIR}/mspm0g3507.lds)



add_executable(${PROJECT_NAME}.elf ${SOURCES} ${LINKER_SCRIPT})

set(HEX_FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.hex)
set(BIN_FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.bin)

add_custom_command(TARGET ${PROJECT_NAME}.elf POST_BUILD
        COMMAND ${CMAKE_OBJCOPY} -Oihex $<TARGET_FILE:${PROJECT_NAME}.elf> ${HEX_FILE}
        COMMAND ${CMAKE_OBJCOPY} -Obinary $<TARGET_FILE:${PROJECT_NAME}.elf> ${BIN_FILE}
        COMMENT "Building ${HEX_FILE}
Building ${BIN_FILE}")

②添加链接文件

        这个还是到gcc那个文件夹,把这个lds文件添加至Furina工程里。添加这个是为了可以在使用CLion构建时看到程序大致占用情况(clang编译器与gcc终归不一样,所以会和实际有些出入)

       

3,配置CLion工程

        接下来先导包,呃我的意思是向Furina这个工程SDK里的两个库,一个是source,另一个是kernel

        然后直接右键Furina这个文件夹用CLion打开,添加cmake项目之类的相信你已经炉火纯青了。

第一次编译的时候会报许多错,原因有三

        其一为“添加的这个sourcekernel库里有脏东西”,比如说下面这个目录里会有IAR、MemMang等不相关的东西。除了GCC都应该把它删掉,这个需要自己对应报错提示去修改,同时配合CMakelists里设置的包含目录和资源文件,过程比较繁琐耗时

        其二为 “缺少相关定义——unfined”,添加个syscalls.c就行了,代码如下(_sbrk可能需要你改,可参照lds链接脚本文件)。同时,不要直接放到Furina工程的ticlang(显示Active Debug的那个目录,我重命名过)里,不然CCS会自动编译它导致构建错误,这里推荐放在外面,

        再在链接脚本文件里添加了一句

_estack = ORIGIN(SRAM) + LENGTH(SRAM);

/**
 ******************************************************************************
 * @file      syscalls.c
 * @author    Auto-generated by STM32CubeIDE
 * @brief     STM32CubeIDE Minimal System calls file
 *
 *            For more information about which c-functions
 *            need which of these lowlevel functions
 *            please consult the Newlib libc-manual
 ******************************************************************************
 * @attention
 *
 * Copyright (c) 2020-2024 STMicroelectronics.
 * All rights reserved.
 *
 * This software is licensed under terms that can be found in the LICENSE file
 * in the root directory of this software component.
 * If no LICENSE file comes with this software, it is provided AS-IS.
 *
 ******************************************************************************
 */

/* 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 */
extern int __io_putchar(int ch) __attribute__((weak));
extern int __io_getchar(void) __attribute__((weak));


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


/* Functions */
void initialise_monitor_handles()
{
}

int _getpid(void)
{
  return 1;
}

int _kill(int pid, int sig)
{
  (void)pid;
  (void)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)
{
  (void)file;
  int DataIdx;

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

  return len;
}

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

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

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


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

int _isatty(int file)
{
  (void)file;
  return 1;
}

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

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

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

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

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

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

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

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

int _execve(char *name, char **argv, char **env)
{
  (void)name;
  (void)argv;
  (void)env;
  errno = ENOMEM;
  return -1;
}
static uint8_t *__sbrk_heap_end = NULL;

/**
 * @brief _sbrk() allocates memory to the newlib heap and is used by malloc
 *        and others from the C library
 *
 * @verbatim
 * ############################################################################
 * #  .data  #  .bss  #       newlib heap       #          MSP stack          #
 * #         #        #                         # Reserved by _Min_Stack_Size #
 * ############################################################################
 * ^-- RAM start      ^-- _end                             _estack, RAM end --^
 * @endverbatim
 *
 * This implementation starts allocating at the '_end' linker symbol
 * The '_Min_Stack_Size' linker symbol reserves a memory for the MSP stack
 * The implementation considers '_estack' linker symbol to be RAM end
 * NOTE: If the MSP stack, at any point during execution, grows larger than the
 * reserved size, please increase the '_Min_Stack_Size'.
 *
 * @param incr Memory size
 * @return Pointer to allocated memory
 */
void *_sbrk(ptrdiff_t incr)
{
    extern uint8_t _end; /* Symbol defined in the linker script */
    extern uint8_t _estack; /* Symbol defined in the linker script */
    extern uint32_t _Min_Stack_Size; /* Symbol defined in the linker script */
    const uint32_t stack_limit = (uint32_t)&_estack - (uint32_t)&_Min_Stack_Size;
    const uint8_t *max_heap = (uint8_t *)stack_limit;
    uint8_t *prev_heap_end;

    /* Initialize heap end at first call */
    if (NULL == __sbrk_heap_end)
    {
        __sbrk_heap_end = &_end;
    }

    /* Protect heap from growing into the reserved MSP stack */
    if (__sbrk_heap_end + incr > max_heap)
    {
        errno = ENOMEM;
        return (void *)-1;
    }

    prev_heap_end = __sbrk_heap_end;
    __sbrk_heap_end += incr;

    return (void *)prev_heap_end;
}

第三个为“缺少ti_msp_dl_config文件”,这个是CCS在Debug里产生的配置文件,复制到一个合适的位置就行(CMakelists要能找到)。或者直接把这个目录里的这两个文件包含进CMakelists里(更推荐)

        那么接下来除了一些小警告意外,就可以正常使用CLion来编写代码了,CLion这里可以检查语法错误,同时也不耽误CCS编译调试程序,开发体验也上去了,三赢零亏。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1928283.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LLM之Prompt(四)| OpenAI、微软发布Prompt技术报告

摘要 生成式人工智能 &#xff08;GenAI&#xff09; 系统正越来越多地部署在各行各业和研究机构。开发人员和用户通过使用提示或提示工程与这些系统进行交互。虽然提示是一个广泛提及且被研究的概念&#xff0c;但由于该领域的新生&#xff0c;存在相互矛盾的术语和对构成提示…

十七、【文本编辑器(三)】图像坐标变换

目录 一、缩放功能 二、旋转功能 三、镜像功能 四、QMatrix简单介绍 一、缩放功能 &#xff08;1&#xff09;在头文件中添加 “protected slots:" 变量&#xff1a; void ShowZoomln( ); &#xff08;2&#xff09;在 createActionso函数的最后添力口事件关联&…

sealos快速安装k8s

Sealos 提供一套强大的工具&#xff0c;使得用户可以便利地管理整个集群的生命周期。 功能介绍 使用 Sealos&#xff0c;您可以安装一个不包含任何组件的裸 Kubernetes 集群。此外&#xff0c;Sealos 还可以在 Kubernetes 之上&#xff0c;通过集群镜像能力组装各种上层分布式…

数据结构——考研笔记(三)线性表之单链表

文章目录 2.3 单链表2.3.1 知识总览2.3.2 什么是单链表2.3.3 不带头结点的单链表2.3.4 带头结点的单链表2.3.5 不带头结点 VS 带头结点2.3.6 知识回顾与重要考点2.3.7 单链表的插入和删除2.3.7.1 按位序插入&#xff08;带头结点&#xff09;2.3.7.2 按位序插入&#xff08;不带…

AI写作不懂提示词 大象Prompt 保姆级系列教程三

一、提示词的核心价值究竟是啥&#xff1f; 最近跟不少业内朋友探讨这事儿&#xff0c;我觉得&#xff1a;提示词的核心价值在于对方法论的封装以及由此带来的知识传播速度加快。 通俗讲&#xff0c;假如你熟悉的行业里有个厉害的“老师傅”&#xff0c;他在核心业务上有好多心…

通用图形处理器设计GPGPU基础与架构(三)

一、前言 前两篇已经介绍了 GPGPU 的背景 和 GPGPU 的编程模型相关的内容&#xff0c;本文将在 SIMT 计算模型的基础上&#xff0c;介绍 GPGPU 控制核心架构和微体系结构的设计。 二、CPU-GPGPU 异构计算系统 一个由 CPU 和 GPGPU 构成的异构计算平台如下图所示&#xff0c;GP…

【常见开源库的二次开发】基于openssl的加密与解密——Base的编解码(二进制转ascll)(二)

目录&#xff1a; 目录&#xff1a; 一、 Base64概述和应用场景 1.1 概述 1.2 应用场景 二、Base16 2.1 Base16编码 2.2 Base16编解码 三、Base64 四、OpenSSL BIO接☐ 4.1 Filter BIOs&#xff1a; 4.2 Source/Sink BIOs&#xff1a; 4.3 应用场景&#xff1a; 4.4 具体使用&…

HCIE是什么等级的证书?

HCIE&#xff08;华为认证互联网专家&#xff0c;Huawei Certified Internetwork Expert&#xff09;是华为认证体系中的最高等级证书。它要求考生具备在复杂网络环境中规划、设计、部署、运维和优化网络的能力。HCIE认证是华为认证体系中最具挑战性和含金量的认证之一&#xf…

EPLAN 去掉PDF中的红色跳转标识

EPLAN PDF图纸导出后体验跳转标识会有红色标识&#xff0c;如何去掉呢&#xff1f;下面介绍一下方法&#xff1a; 此为现象&#xff1a; EPLAN 2.9的帮助文档里提示&#xff1a; 在导出的 PDF 文档中&#xff0c;跳转后的跳转目标现在通过红色的闪烁框进行标识。可能的跳转目…

探索Node.js中的node-xlsx:将Excel文件解析为JSON

在Node.js开发中&#xff0c;处理Excel文件是一个常见需求&#xff0c;特别是在需要导入大量数据或生成报表的场景中。node-xlsx 是一个强大的库&#xff0c;它提供了Excel文件的解析和生成功能。本文将深入探讨 node-xlsx 的使用&#xff0c;并通过一个案例演示如何将Excel文件…

蒙特卡洛树搜索

目录 1. 选择&#xff08;Selection&#xff09;2. 扩展&#xff08;Expansion&#xff09;3. 模拟&#xff08;Simulation&#xff09;4. 反向传播&#xff08;Backpropagation&#xff09;为什么蒙特卡洛树搜索很厉害&#xff1f;应用实例 蒙特卡洛树搜索介绍 蒙特卡洛树搜索…

【从0到1进阶Redis】哨兵模式

笔记内容来自B站博主《遇见狂神说》&#xff1a;Redis视频链接 小伙伴们可以看一下上一篇我的Redis笔记 —— 【从0到1进阶Redis】主从复制 这样可以更好的理解原理。 一、概述 主从切换技术的方法是&#xff1a;当主服务器宕机后&#xff0c;需要手动把一台从服务器切换为主服…

Parallels Desktop 19 for Mac(PD19虚拟机)详细图文安装教程分享

Parallels Desktop 19是一款功能丰富、性能强大且易于使用的虚拟机软件&#xff0c;它可以让您在Mac上同时运行多个操作系统&#xff0c;为您提供更大的灵活性和兼容性。 Parallels Desktop 19 for Mac(PD19虚拟机)下载安装包 Parallels Desktop 19 for Mac(PD19虚拟机)详细图…

在VS2017下FFmpeg+SDL编写最简单的视频播放器

1.下载ShiftMediaProject/FFmpeg 2.下载SDL2 3.新建VC控制台应用 3.配置include和lib 4.把FFmpeg和SDL的dll 复制到工程Debug目录下&#xff0c;并设置调试命令 5.复制一下mp4视频到工程Debug目录下&#xff08;复制一份到*.vcxproj同一目录&#xff0c;用于调试&#xff09; 6…

虚拟机的状态更新

文章目录 虚拟机的更新一、检查虚拟机的配置1.已连接状态2. 保证镜像源挂载 二、进行更新三、其余事项 虚拟机的更新 虚拟机的更新是确保系统软件包和库的更新&#xff0c;以获得最新的修复和改进&#xff1b;如果长期没有打开单机或者集群&#xff0c;可以考虑先进行一次更新…

CentOS 停服后,服务器 OS 路在何方?

2024 年 6 月 30 日&#xff0c;CentOS Linux 7 终止其生命周期&#xff08;EOL&#xff09;&#xff0c;至此 CentOS 全系列版本也已停止维护&#xff0c;属于 CentOS 的时代彻底终结。CentOS 停止维护后&#xff0c;用户将无法获得包括问题修复和功能更新在内的任何软件维护和…

深度学习与神经网络介绍

目录 一&#xff1a;深度学习的概念 二&#xff1a;机器学习和深度学习的区别 1.特征提取&#xff1a; 三&#xff1a;深度学习的应用场景 1.图像识别 2.自然语言处理技术 3.语音技术 四&#xff1a;神经网络的介绍 1.人工神经网络的概念 2.神经元的概念 3.单层神经网…

【论文阅读】《Visual Prompt Tuning》

Abstract. 目前调整预训练模型的工作方式包括更新所有骨干参数&#xff0c;即全面微调。本文介绍了视觉提示调整&#xff08;VPT&#xff09;&#xff0c;作为大规模视觉变换器模型全面微调的高效替代方案。VPT 从高效调整大型语言模型的最新进展中汲取灵感&#xff0c;只在输…

uniapp 实现上传文件的功能

上传单个文件 <script setup>const handleUploadClick () > {console.log("上传文件")uni.chooseImage({success: (chooseImageRes) > {const tempFilePaths chooseImageRes.tempFilePaths;console.log("用户选择的图片&#xff1a;", temp…

华为HCIP Datacom H12-821 卷40

1.单选题 下面是台路由器BGP错误输出信息&#xff0c;关于这段信息描述错误的是 <HUAWEI>display bgp error Error Type :Peer Error Date/Time :2010-03-22 12:40:39 Peer Address :10.1.1.5 Error Info : Incorrect remote AS A、可能是由于邻居…