MAN 发表于 2013-10-24 13:13:27

用Eclipse替代Keil&IAR来开发ARM应用

本帖最后由 MAN 于 2013-11-29 22:51 编辑

按惯例,这篇帖子还是以索引为主。
我使用Eclipse来开发c/c++,一是对Keil/IAR的界面及其不满,还停留在20世纪的界面风格,连个自动代码不全都没有!二来公司预算有限,Keil/IAR一个license就得5,6万人刀,现在有免费的用,何乐而不为呢,况且几个月评估下来,Eclipse绝对是把利器!下面,我争取用5句话来把安装说完。

1、花点小钱把你的机器升级下。Eclipse的缺点是基于Java,对开发机要求高。建议换个SSD硬盘,编译速度立马提升50%。内存4G以内的话开两三个Eclipse窗口无压力,想要更猛一些,建议升级到8G或更高。
2、到http://www.eclipse.org/downloads/下载最新的Eclipse IDE for C/C++ Developers。注意是C/C++版本,不是标准版,标准版的话你还得自己装C/C++的若干插件。截止发帖,Eclipse最新版本叫Kepler,140M的压缩包,解压缩后直接运行eclipse.exe即可,无需安装。
3、安装GNU ARM Toolchain。工具链有两种,一个是Yagarto,一个是sourcery g++ lite,建议两个都装上,我个人感觉yagarto编译速度更快一些。
3.1 Yagarto的安装包:http://www.emb4fun.de/archive/gabmt/index.html
3.2 sourcery的安装包见这篇教程《ARM Cortex M3开发环境搭建---(eclipse CDT和 Sourcery G++ Lite)》:http://hi.baidu.com/hyper99/item/c5462912a71d705e2b3e2257
4、makefile。
4.1 可以自己写makefile,参考:http://www.emb4fun.de/arm/examples/index.html,makefile在压缩包里。makefile适合高手,我自己用了俩月,直到遇到下面的插件,就彻底抛弃raw makefile了。
4.2 使用上面教程里介绍的GNU ARM Eclipse Plug-in,非常好用,强烈推荐!装了这个插件,和IAR/KEIL一样,只要填填菜单就好了,效果见截图。然后makefile都是自动生成,全自动哦,自动到你都感觉不到有makefile存在。
5、GDB Server,Eclipse下用gdb来调试程序,大概流程是这样:
Eclipse IDE <--> eclipse gdb plugin <--> J-Link gdb server软件 <--> J-Link <--> JTAG/SWD接口 <--> 目标板。
5.1 首先,安装GDB的插件,有两个:
    一个是“GDB Hardware Debugging”,设置方法参考:http://www.emb4fun.de/archive/eclipse/index.html,搜索:Configure the debugger。如果没找到该插件,那就照该文章上面介绍的装一下。
    还有一个是上面的教程里提到的Zylin Embedded CDT。这俩插件可以都装上用用看,我个人推荐第一个,还是原装的好用点。
5.2 安装JLink的软件包,打开“J-Link GDB Server via SWD”,选USB,确认
5.3 Eclipse里编译好后,选“Debug --> 配置好的gdb选项"。这一步最关键,可以按emb4fun上的教程做,有搞不定的联系我,偷偷告诉你一个取巧的办法,嘿嘿


好了,说好的5句话,变成了5大步。接下来,什么单步,什么断点,什么看内存、看变量、条件断点、乱七八糟的全支持。而且还有一堆牛b插件等着你去开发,比如如果你用FreeRTOS,有个插件可以实时显示stack使用量、优先级等等信息。

写的比较简单,有什么问题欢迎加入QQ群讨论,号码:185275258(STM32-USB)

wing 发表于 2013-10-24 14:22:43

MDK虽然老旧但是用户多,资源丰富,怎么省也得装个破解版吧

wing 发表于 2013-10-24 14:26:57

我只玩NXP的ARM,好歹配套个CODE RED,自己配置Eclipse真不太会

feel 发表于 2013-10-24 15:27:15

有没有这么强大?

johnsonzzd 发表于 2013-10-24 21:59:18

我用stlink,swd方式。折腾了半天,都不支持。

MAN 发表于 2013-10-25 09:05:09

johnsonzzd 发表于 2013-10-24 21:59 static/image/common/back.gif
我用stlink,swd方式。折腾了半天,都不支持。

我一开始用的就是stlink,不过是用Atollic的评估版Eclipse,后来嫌速度太慢,就换Jlink了。

MAN 发表于 2013-10-25 09:14:09

johnsonzzd 发表于 2013-10-24 21:59 static/image/common/back.gif
我用stlink,swd方式。折腾了半天,都不支持。

stlink做gdb server的话,参考这个网页:
http://www.emb4fun.de/archive/stlink/index.html

主要是下载这个软件:http://www.emb4fun.de/download/arm/stlink/stlink-20130324-win.zip
然后在dos命令行下输入:st-util.exe
返回:
STLINK GDB Server (Dec 27 2012 19:29:29)
Many thanks to the STLINK development team.
(https://github.com/texane/stlink)

2012-12-28T17:30:08 INFO src/stlink-usb.c: -- exit_dfu_mode
2012-12-28T17:30:08 INFO src/stlink-common.c: Loading device parameters....
2012-12-28T17:30:08 INFO src/stlink-common.c: Device connected is: F4 device, id
0x20006411
2012-12-28T17:30:08 INFO src/stlink-common.c: SRAM size: 0x30000 bytes (192 KiB)
, Flash: 0x100000 bytes (1024 KiB) in pages of 16384 bytes
Chip ID is 00000413, Core ID is 2ba01477.
KARL - should read back as 0x03, not 60 02 00 00
Listening at *:4242...

然后修改5.3步里的GDB配置->Startup,把端口号改成上面这个4242:
# connect to the J-Link gdb server
target extended-remote localhost:4242

MAN 发表于 2013-10-25 09:16:55

wing 发表于 2013-10-24 14:26 static/image/common/back.gif
我只玩NXP的ARM,好歹配套个CODE RED,自己配置Eclipse真不太会

自己配的话是有些难度的,第一次弄搞个两三天是要的,不过上手了配置一下也就几分钟的事。

johnsonzzd 发表于 2013-10-27 21:34:57

本帖最后由 johnsonzzd 于 2013-10-27 22:25 编辑

求助楼主。折腾了一天,最后一步又卡住了。
c:/sourcery_codebench_lite_for_arm_eabi/bin/../lib/gcc/arm-none-eabi/4.7.3/../../../../arm-none-eabi/lib/thumb2\libc.a(lib_a-sbrkr.o): In function `_sbrk_r':
sbrkr.c:(.text+0x12): undefined reference to `_sbrk'
collect2.exe: error: ld returned 1 exit status
cs-make: *** Error 1
查了一下,原因是使用了printf、malloc这种标准库函数,貌似需要自己实现。网上有实现的却是linux下的,太崩溃了。
楼主有办法么?

-------------------------------------------------------
已解决
https://sites.google.com/site/stm32discovery/open-source-development-with-the-stm32-discovery/getting-newlib-to-work-with-stm32-and-code-sourcery-lite-eabi

johnsonzzd 发表于 2013-10-27 23:15:52

多谢楼主,stlink swd方式搞定了。问题:
1. 每一次开始调试都要先运行st-util .exe
2. 每次调试都要刷一遍flash

MAN 发表于 2013-10-28 09:42:09

johnsonzzd 发表于 2013-10-27 23:15 static/image/common/back.gif
多谢楼主,stlink swd方式搞定了。问题:
1. 每一次开始调试都要先运行st-util .exe
2. 每次调试都要刷一 ...

1、那肯定要的,但每天开机时跑一次就行了吧?至少我的jlink gdb server是这样的
2、你可以在ram里跑,另外如果只是reset,不需要重新download,见图:

MAN 发表于 2013-10-28 09:59:52

johnsonzzd 发表于 2013-10-27 21:34 static/image/common/back.gif
求助楼主。折腾了一天,最后一步又卡住了。
c:/sourcery_codebench_lite_for_arm_eabi/bin/../lib/gcc/arm ...

是的,其实我这个教程只是抛砖引玉,好多细节我都没说。:D

printf我用的是atollic提供的tiny_printf.c,具体到printf,代码如下:
/**
**===========================================================================
**Abstract: Loads data from the given locations and writes them to the
**            standard output according to the format parameter.
**Returns:Number of bytes written
**
**===========================================================================
*/
int printf(const char *fmt, ...)
{
        int length = 0;
        va_list va;
        va_start(va, fmt);
        length = ts_formatlength(fmt, va);
        va_end(va);
        {
                char buf;
                va_start(va, fmt);
                length = ts_formatstring(buf, fmt, va);
                length = _write(1, buf, length);
                va_end(va);
        }
        return length;
}


里面的_write重定向到syscalls.c
int _write(int file, char *ptr, int len)
{
        int i;
        for (i=0; i<len; i++)
        {
                __uart_putchar(*(ptr++));
        }
        return len;
}

__uart_putchar重定向到st提供的bsp函数

/**
* @briefRetargets the C library printf function to the USART.
* @paramNone
* @retval None
*/
int __uart_putchar(int ch)
{
        /* Place your implementation of fputc here */
        /* e.g. write a character to the USART */
        USART_SendData(EVAL_COM1, (uint8_t) ch);

        /* Loop until the end of transmission */
        while (USART_GetFlagStatus(EVAL_COM1, USART_FLAG_TC) == RESET)
        {}

        return ch;
}

tiny_printf.c和syscalls.c网上搜搜看。


johnsonzzd 发表于 2013-10-28 17:18:33

结束调试后st-util会自动结束,下次调试还需要再运行。还是jlink通用,就是体积有点大。

MAN 发表于 2013-10-28 23:06:39

johnsonzzd 发表于 2013-10-28 17:18 static/image/common/back.gif
结束调试后st-util会自动结束,下次调试还需要再运行。还是jlink通用,就是体积有点大。

jlink的gdb server比较智能,除非你把它关掉,否则下次调试它会自动重连的。界面见下图:
页: [1]
查看完整版本: 用Eclipse替代Keil&IAR来开发ARM应用