Friday, October 1, 2010

One new trick for an old dog

Well... There is no much trick in the ten pin 0.05" (1.27mm) ARM JTAG/SWD connector, but it is definitely new for "an old dog" - LPC2103.
A few weeks ago I received several small 0.85 x 1.26" (23 x 32mm) LPC210x header boards from BatchPCB. OpenOCD version 0.3.1 with FTDI2232 based adapter does work with LPC2103 on the board via new tiny JTAG connector. However, the OpenOCD configuration file needs minor adjustment since the connector has no TRST pin. So the reset configuration should include srst_only to let the OpenOCD know that TRST is not available.

Thursday, April 1, 2010

CMSIS 2.0 Alpha

New Alpha version of CMSIS except adding Cortex-M4 support has replaced implementation of single assembly instruction functions by making them inline and moving code to dedicated header files (core_cmFunc.h and core_cmInstr.h) in CoreSupport folder. Thanks ARM! Now I can utilize original CMSIS code in my projects instead of coping functions with modified names to an additional header file. Nevertheless, the definition of __INLINE for GCC compiler still does not enforce actual inlining of the code as I described in the previous post. Well. I hope it will be fixed in the final release.

Monday, February 1, 2010

Using CMSIS with GCC

My interest in ARM Cortex-M3 based micros recently turned into some practical exercises with STM32-H103, GCC and Cortex Microcontroller Software Interface Standard (CMSIS) library. CMSIS is a useful set of definitions of Cortex-M0/M3 core architecture registers, data structures and interfaces to access core resources of a Cortex-M0/M3 based microcontroller. However, if you use GCC with CMSIS (v1.2.0 or v1.3.0) the definition of __INLINE macro provided in core_cm3.h and core_cm0.h:
#define __INLINE inline
does not force the compiler to actually inline the body of a function defined with __INLINE attribute. To tell GCC to inline the define should be:
#define __INLINE __attribute__((always_inline)) inline
Furthermore, __get_xxx, __set_xxx, __LDREX, __STREX groups of a single assembly line functions implemented as a regular functions as oppose to inline functions. Change of these functions to inline style allowed two times improvement of the performance of certain fragments of my code.