极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

楼主: MAN

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

[复制链接]
发表于 2013-10-24 13:13:27 | 显示全部楼层 |阅读模式
本帖最后由 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)
回复

使用道具 举报

发表于 2013-10-24 14:22:43 | 显示全部楼层
MDK虽然老旧但是用户多,资源丰富,怎么省也得装个破解版吧
回复 支持 反对

使用道具 举报

发表于 2013-10-24 14:26:57 | 显示全部楼层
我只玩NXP的ARM,好歹配套个CODE RED,自己配置Eclipse真不太会
回复 支持 反对

使用道具 举报

发表于 2013-10-24 15:27:15 | 显示全部楼层
有没有这么强大?
回复 支持 反对

使用道具 举报

发表于 2013-10-24 21:59:18 | 显示全部楼层
我用stlink,swd方式。折腾了半天,都不支持。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-10-25 09:05:09 | 显示全部楼层
johnsonzzd 发表于 2013-10-24 21:59
我用stlink,swd方式。折腾了半天,都不支持。

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

使用道具 举报

 楼主| 发表于 2013-10-25 09:14:09 | 显示全部楼层
johnsonzzd 发表于 2013-10-24 21:59
我用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
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-10-25 09:16:55 | 显示全部楼层
wing 发表于 2013-10-24 14:26
我只玩NXP的ARM,好歹配套个CODE RED,自己配置Eclipse真不太会

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

使用道具 举报

发表于 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: *** [ytu.elf] 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
回复 支持 反对

使用道具 举报

发表于 2013-10-27 23:15:52 | 显示全部楼层
多谢楼主,stlink swd方式搞定了。问题:
1. 每一次开始调试都要先运行st-util .exe
2. 每次调试都要刷一遍flash
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-10-28 09:42:09 | 显示全部楼层
johnsonzzd 发表于 2013-10-27 23:15
多谢楼主,stlink swd方式搞定了。问题:
1. 每一次开始调试都要先运行st-util .exe
2. 每次调试都要刷一 ...

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-10-28 09:59:52 | 显示全部楼层
johnsonzzd 发表于 2013-10-27 21:34
求助楼主。折腾了一天,最后一步又卡住了。
c:/sourcery_codebench_lite_for_arm_eabi/bin/../lib/gcc/arm ...

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

printf我用的是atollic提供的tiny_printf.c,具体到printf,代码如下:
[pre lang="c" line="1"]/**
**===========================================================================
**  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[length];
                va_start(va, fmt);
                length = ts_formatstring(buf, fmt, va);
                length = _write(1, buf, length);
                va_end(va);
        }
        return length;
}
[/code]

里面的_write重定向到syscalls.c
[pre lang="c" line="1"]int _write(int file, char *ptr, int len)
{
        int i;
        for (i=0; i<len; i++)
        {
                __uart_putchar(*(ptr++));
        }
        return len;
}[/code]

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

  1. /**
  2.   * @brief  Retargets the C library printf function to the USART.
  3.   * @param  None
  4.   * @retval None
  5.   */
  6. int __uart_putchar(int ch)
  7. {
  8.         /* Place your implementation of fputc here */
  9.         /* e.g. write a character to the USART */
  10.         USART_SendData(EVAL_COM1, (uint8_t) ch);

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

  14.         return ch;
  15. }
复制代码


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


回复 支持 反对

使用道具 举报

发表于 2013-10-28 17:18:33 | 显示全部楼层
结束调试后st-util会自动结束,下次调试还需要再运行。还是jlink通用,就是体积有点大。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-10-28 23:06:39 | 显示全部楼层
johnsonzzd 发表于 2013-10-28 17:18
结束调试后st-util会自动结束,下次调试还需要再运行。还是jlink通用,就是体积有点大。

jlink的gdb server比较智能,除非你把它关掉,否则下次调试它会自动重连的。界面见下图:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-28 21:44 , Processed in 0.050006 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表