TrueStudio上手

之前ST宣布收购软件开发工具厂商Atollic。现在ST正式发布整合后第一个Atollic TrueSTUDIO版本 9.0,正式为STM32用户提供全免费、全功能的专业MCU集成开发环境。

下载地址:https://atollic.com/resources/download/windows/windows-archive/?submissionGuid=6a9df4f2-76ee-4575-adac-7d5172666c12

TrueStudio编译HAL库很快,至少是MDK快几倍不止,IAR不是主力没比较过,但肯定比MDK快。MDK编译想快,不需要browse information选项定位也试蛮快的。

TrueStudio是基于Eclipse 的,所以很多设置都是一样的。

1.MDK重定向printf

int fputc(int ch,FILE *f)//重定向printf

{

    HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);

    return ch;

}

2.TrueStudio重定向printf

和SW4STM32都用的是GUN的编译器,所以和SW4STM32的方式是一样的,就是重定向 int __io_putchar(int ch)函数,而不是KEIL的fputc函数。

int __io_putchar(int ch) {

        HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 0xffff);

        return ch;

}

并且调用一个叫syscalls.c的源文件(CubeMX配置会生成),配合__io_putchar来实现。

/* Support files for GNU libc. Files in the system namespace go here.

Files in the C namespace (ie those that do not start with an

underscore) go in .c. */

#include <_ansi.h>

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#undef errno

extern int errno;

#define FreeRTOS

#define MAX_STACK_SIZE 0x200

extern int __io_putchar(int ch) __attribute__((weak));

extern int __io_getchar(void) __attribute__((weak));

#ifndef FreeRTOS

register char * stack_ptr asm("sp");

#endif

 

 

 

caddr_t _sbrk(int incr)

{

    extern char end asm("end");

    static char *heap_end;

    char *prev_heap_end,*min_stack_ptr;

    if (heap_end == 0)

        heap_end = &end;

    prev_heap_end = heap_end;

#ifdef FreeRTOS

    /* Use the NVIC offset register to locate the main stack pointer. */

    min_stack_ptr = (char*)(*(unsigned int *)*(unsigned int *)0xE000ED08);

    /* Locate the STACK bottom address */

    min_stack_ptr -= MAX_STACK_SIZE;

    if (heap_end + incr > min_stack_ptr)

#else

    if (heap_end + incr > stack_ptr)

#endif

    {

//      write(1, "Heap and stack collision\n", 25);

//      abort();

        errno = ENOMEM;

        return (caddr_t) -1;

    }

    heap_end += incr;

    return (caddr_t) prev_heap_end;

}

/*

* _gettimeofday primitive (Stub function)

* */

int _gettimeofday (struct timeval * tp, struct timezone * tzp)

{

/* Return fixed data for the timezone. */

if (tzp)

{

tzp->tz_minuteswest = 0;

tzp->tz_dsttime = 0;

}

return 0;

}

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) {}

}

int _write(int file, char *ptr, int len)

{

    int DataIdx;

        for (DataIdx = 0; DataIdx < len; DataIdx++)

        {

         __io_putchar( *ptr++ );

        }

    return len;

}

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 _read(int file, char *ptr, int len)

{

    int DataIdx;

    for (DataIdx = 0; DataIdx < len; DataIdx++)

    {

     *ptr++ = __io_getchar();

    }

return len;

}

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;

}

They are not defined as weak but since the build system will choose implementation in source files before trying to link from libraries you can just implement them as you want. In TS the recommended way is to generate the syscalls.c file from File > New > Other > syscalls...

<>

3.包含头文件和源文件

TrueStudio工程是包含了工程所有的文件夹和文件,在工程文件夹下新建文件夹,工程中就会更新。

3.1包含头文件

项目--属性--C/C++ Build--Settings--Tool Settings--C Compiler--Dirctories

TrueStudio上手_第1张图片

项目--属性--C/C++ General--Paths and Symbols

TrueStudio上手_第2张图片

 

3.2包含源文件

TrueStudio上手_第3张图片

4.设置优化等级

项目--属性 设置为-O1

TrueStudio上手_第4张图片

O1优化会消耗少多的编译时间,它主要对代码的分支,常量以及表达式等进行优化。

 

O2会尝试更多的寄存器级的优化以及指令级的优化,它会在编译期间占用更多的内存和编译时间。

 

O3在O2的基础上进行更多的优化,例如使用伪寄存器网络,普通函数的内联,以及针对循环的更多优化。

 

Os主要是对代码大小的优化,我们基本不用做更多的关心。 通常各种优化都会打乱程序的结构,让调试工作变得无从着手。并且会打乱执行顺序,依赖内存操作顺序的程序需要做相关处理才能确保程序的正确性。 

5.设置VScode编码方式

设置搜索encoding,修改utf-8为GBK

6.TrueStudio快捷键

大多都是Eclipse的快捷键

                    

功能

快捷键

说明

注释代码

Ctrl + Shift + /

注释 /*  */

取消注释

Ctrl + Shift + \

取消注释 /* */

注释代码

Ctrl + /

注释当前行,可选多行  //

注释代码

再按Ctrl  + /

取消注释 //

跳回

Ctrl + Q

定位到最后编辑的地方

删除当前行

Ctrl + D

 

快速修复

Ctrl + 1

 

快速显示

Ctrl + O

快速定位方式和变量

前一个编辑页面

Alt + ←

快速回去

下一个编辑页面

Alt + →

 

定位到某一行

Ctrl + L

行号

7.设置代码模板

窗口--首选项

TrueStudio上手_第5张图片

在文档中打出新建模板的名称,Ctrl+/

8.安装插件

帮助--eclipse Marketplace

更换代码颜色和风格插件--Eclipse Color Themes

设置代码颜色 首选项--外观--颜色 或者直接搜索 theme

直接去官网找颜色导入也可以http://eclipsecolorthemes.org/,但好像打不开啊。

主题:windows classic  Color Theme Mr

 

其它调试和编译都很清楚,查看寄存器什么的后面在写。(直接从OneNote笔记中复制过来的,格式什么的链接一下,毕竟很久没有用Typora了)

参考:

1.[STM32] printf 重定向到 UART

2.[已解决] printf在TrueSTUDIO中无法使用

3.Redirect UART to use printf and scanf

4.gcc -O0 -O1 -O2 -O3 四级优化选项及每级分别做什么优化

5.eclipse中快速多行注释的方法以及Myeclipse快捷

6.Eclipse 代码模板|菜鸟教程

7.eclipse设置酷炫的代码颜色风格

你可能感兴趣的:(TrueStudio,STM32编译器,TrueStudio)