Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: MSP-GCC 4. Кто-нибудь пробовал?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
Страницы: 1, 2
AHTOXA
http://mspgcc4.sourceforge.net/

Пишут, что
Цитата
GCC 4.x has several advantages over the old 3.2.3 branch. Here are the most important:

  • Better optimization. The generated code is typically 7%-10% smaller than code generated by MSPGCC-3.2.3
  • Better debug info support. The objdump utility displays the mixed assembly/code correctly.
  • Better C++ and inlining support. Unused local variables are automatically filtered out. Inline functions are implemented in a much more compact way.
  • Support for various handy features. For example, gcc 4.3 correctly handles the #pragma once statements.
  • Additionally, the MSPGCC4 port fixes the data-sections bug present in all original MSPGCC versions, allowing using -ffunction-sections and -fdata-sections switches.


Насчёт -ffunction-sections and -fdata-sections врут похоже, у меня и с ними и в текущем msp-gcc нет проблем.

Короче, если кто-то пробовал, поделитесь пожалуйста впечатлениями.
Ko4egap
Отличная новость! Завтра буду пробовать. Надеюсь в нём реализована полноценная поддержка 5й серии
mdmitry
Цитата(Ko4egap @ Oct 11 2009, 12:23) *
Отличная новость! Завтра буду пробовать. Надеюсь в нём реализована полноценная поддержка 5й серии

Ваши надежды преждевременны. rolleyes.gif Вся аппаратная часть для 54xx закомментирована.Мне не удалось собрать проект для 5437.
MrYuran
Выкачал, стал запускать - пишет, мол, файл исполняемый, но не для этой системы (у меня дома ради изврата XP64 стоит).
Завтра на работе попробую.

Радует хотя бы, что что-то шевелится, а не заглохло, как на исходном mspgcc.
AHTOXA
Цитата(MrYuran @ Nov 1 2009, 18:32) *
Радует хотя бы, что что-то шевелится, а не заглохло, как на исходном mspgcc.

Насколько я понял, там "шевелится" только в одном направлении - адаптация под GCC 4. Никаких изменений в плане поддержки новых чипов не наблюдается.
Но в любом случае, лучше хоть такое движение, чем никакого.
MrYuran
Цитата(AHTOXA @ Nov 2 2009, 00:27) *
Насколько я понял, там "шевелится" только в одном направлении - адаптация под GCC 4. Никаких изменений в плане поддержки новых чипов не наблюдается.

Мне новые чипы пока неактуальны, а вот некоторые глюки слегка напрягают (например, проблемы с выровненными структурами и юнионами)
Может, в новом GCC это уже пофиксено?
Кстати, а в чём заключается поддержка новых чипов? Неужто там настолько всё по-другому?
Запустил... smile3046.gif
Цитата
D:\Program Files>F:\NEW\msp430-gcc-4.4.2-gdb-7.0-insight-6.8.exe
Программа не умещается в памяти
D:\PROGRA~1>

Ныпонил... 07.gif
mdmitry
Цитата(MrYuran @ Nov 2 2009, 09:07) *
Кстати, а в чём заключается поддержка новых чипов? Неужто там настолько всё по-другому?

Описание периферии (специальные регистры). В GCC часто заголовочный файл один на группу периферии, а в 54xx периферия изменена и ее больше. Уже дополнительный файл для GPIO 54xx создан. Существующая система заголовочных файлов, похоже (IMHO), плохо стыкуется с новыми контроллерами в плане совместимости. У IAR и CCE один большой файл на конкретный микроконтроллер.
Цитата
Мне новые чипы пока неактуальны...

Для меня, к сожалению, актуальна только серия 54xx.
MrYuran
Цитата(mdmitry @ Nov 2 2009, 15:22) *
У IAR и CCE один большой файл на конкретный микроконтроллер.

Ну так и что мешает вместо <io.h> подключить готовый файл от ИАРа?
Другое дело, когда несовместимость на уровне процессорного ядра и надо править бэкэнд компилятора (вроде не перепутал biggrin.gif )
mdmitry
Цитата(MrYuran @ Nov 2 2009, 15:39) *
Ну так и что мешает вместо <io.h> подключить готовый файл от ИАРа?
Другое дело, когда несовместимость на уровне процессорного ядра и надо править бэкэнд компилятора

IAR и ССЕ потянет за собой ещё свои файлы (например, in430.h, intrinsics.h) со своими pragma. Разбираться в этом большого желания нет.
Про кодогенерацию не знаю, особенно при объеме кода более 64к.
MrYuran
Таки распаковал... Йошкин кот!
265 МЕТРОВ!!!
Чего туда понапихали?!!
Вроде всё то же...

Кстати, для 54хх хедеры лежат без комментиариев, может уже и работают...
CODE
#if !defined(__msp430x54xx)
#define __msp430x54xx

/* msp430x54xx.h
*
* mspgcc project: MSP430 device headers
* MSP430x54xx family header
*
* © 2006 by Steve Underwood <steveu@coppice.org>
* Originally based in part on work by Texas Instruments Inc.
*
* 2008-10-08 - sb-sf (sb-sf@users.sf.net)
* - created, based on msp430xG461x.h
*
* $Id: msp430x54xx.h,v 1.5 2009/06/04 21:55:18 cliechti Exp $
*/

#include <iomacros.h>

#define __MSP430_HAS_T0A5__
#define __MSP430_HAS_T1A3__
#define __MSP430_HAS_UCS__
#define __MSP430_HAS_USCI0_5__
#define __MSP430_HAS_USCI1_5__
#define __MSP430_HAS_USCI2_5__
#define __MSP430_HAS_USCI2_5__
#define __MSP430_SYS_BASE__ 0x180
#define __MSP430_WDT_A_BASE__ 0x150
#define __MSP430_PORT1_BASE__ 0x200
#define __MSP430_PORT2_BASE__ 0x200
#define __MSP430_PORT3_BASE__ 0x220
#define __MSP430_PORT4_BASE__ 0x220
#define __MSP430_PORT5_BASE__ 0x240
#define __MSP430_PORT6_BASE__ 0x240
#define __MSP430_PORT7_BASE__ 0x260
#define __MSP430_PORT8_BASE__ 0x260
#define __MSP430_PORT9_BASE__ 0x280
#define __MSP430_PORT10_BASE__ 0x280
#define __MSP430_PORT11_BASE__ 0x2A0
#define __MSP430_PORTJ_BASE__ 0x320

#define __MSP430_MPY32_BASE__ 0x4C0


#include <msp430/wdt_a.h>
#include <msp430/sys.h>
#include <msp430/gpio_5xxx.h>
#include <msp430/mpy32.h>
#include <msp430/timera.h>
#include <msp430/unified_clock_system.h>
#include <msp430/usci.h>

/*

Empty yet sad.gif

*/
#define GIE 0x0008

#define SFRIE1_ 0x0100 /* Interrupt Enable 1 */
#define SFRIE1_L_ SFRIE1_
#define SFRIE1_H_ SFRIE1_ + 0x01
sfrw(SFRIE1, SFRIE1_);
sfrb(SFRIE1_L, SFRIE1_L_);
sfrb(IE1, SFRIE1_L_);
sfrb(SFRIE1_H, SFRIE1_H_);
sfrb(IE2, SFRIE1_H_);
#define WDTIE (1<<0)
#define OFIE (1<<1)
/* RESERVED (1<<2)*/
#define VMAIE (1<<3)
#define NMIIE (1<<4)
#define ACCVIE (1<<5)
#define JMBINIE (1<<6)
#define JMBOUTIE (1<<7)

#define SFRIFG1_ 0x0102 /* Interrupt Flag 1 */
#define SFRIFG1_L_ SFRIFG1_
#define SFRIFG1_H_ SFRIFG1_ + 0x01
sfrw(SFRIFG1, SFRIFG1_);
sfrb(SFRIFG1_L, SFRIFG1_L_);
sfrb(IFG1, SFRIFG1_L_);
sfrb(SFRIFG1_H, SFRIFG1_H_);
sfrb(IFG2, SFRIFG1_H_);
#define WDTIFG (1<<0)
#define OFIFG (1<<1)
/* RESERVED (1<<2)*/
#define VMAIFG (1<<3)
#define NMIIFG (1<<4)
/* RESERVED (1<<5)*/
#define JMBINIFG (1<<6)
#define JMBOUTIFG (1<<7)

#define SFRRPCR_ 0x0104 /* Reset pin control */
sfrw(SFRRPCR, SFRRPCR_);
#define SFRRPCR_L_ SFRRPCR_
#define SFRRPCR_H_ SFRRPCR_ + 0x01
sfrb(SFRRPCR_L, SFRRPCR_L_);
sfrb(SFRRPCR_H, SFRRPCR_H_);
#define SYSNMI (1<<0) /* RST/NMI pin (0:Reset, 1: NMI) */
#define SYSNMIIES (1<<1) /* NMI edge select (0:rising edge). Can trigger NMI */
#define SYSRSTUP (1<<2) /* Reset resistor pin pullup (0: pulldown, 1: pullup) */
#define SYSRSTRE (1<<3) /* Reset pin resistor enable (0: disabled, 1: enabled) */


#define RTC_A_VECTOR 0x52 /* 0xFFD2 Basic Timer / RTC */
#define PORT2_VECTOR 0x54 /* 0xFFD4 Port 2 */
#define USCIB3_RXTX_VECTOR 0x56 /* 0xFFD6 USCI B3 RX/TX */
#define USCIA3_RXTX_VECTOR 0x58 /* 0xFFD8 USCI A3 RX/TX */
#define USCIB1_RXTX_VECTOR 0x5A /* 0xFFDA USCI B1 RX/TX */
#define USCIA1_RXTX_VECTOR 0x5C /* 0xFFDC USCI A1 RX/TX */
#define PORT1_VECTOR 0x5E /* 0xFFDE Port 1 */
#define TIMER1_A1_VECTOR 0x60 /* 0xFFE0 Timer1_A3 CC1-2, TA1 */
#define TIMER1_A0_VECTOR 0x62 /* 0xFFE2 Timer1_A3 CC0 */
#define DMA_VECTOR 0x64 /* 0xFFE4 DMA */
#define USCIB2_RXTX_VECTOR 0x66 /* 0xFFE6 USCI B2 RX/TX */
#define USCIA2_RXTX_VECTOR 0x68 /* 0xFFE8 USCI A2 RX/TX */
#define TIMER0_A1_VECTOR 0x6A /* 0xFFEA Timer0_A5 CC1-4, TA0 */
#define TIMER0_A0_VECTOR 0x6C /* 0xFFEC Timer0_A5 CC0 */
#define AD12_A_VECTOR 0x6E /* 0xFFEE ADC */
#define USCIB0_RXTX_VECTOR 0x70 /* 0xFFF0 USCI B0 RX/TX */
#define USCIA0_RXTX_VECTOR 0x72 /* 0xFFF2 USCI A0 RX/TX */
#define WDT_VECTOR 0x74 /* 0xFFF4 Watchdog Timer */
#define TIMER0_B1_VECTOR 0x76 /* 0xFFF6 Timer_B7 CC1-6, TB */
#define TIMER0_B0_VECTOR 0x78 /* 0xFFF8 Timer_B7 CC0 */
#define USER_NMI_VECTOR 0x7A /* 0xFFFA Non-maskable */
#define NMI_VECTOR 0x7C /* 0xFFFC Non-maskable */

#endif /* #ifndef __msp430x54xx */
mdmitry
Цитата(MrYuran @ Nov 6 2009, 13:14) *
Кстати, для 54хх хедеры лежат без комментиариев, может уже и работают...

Вы посмотрите у себя файл ...\mspgcc\msp430\include\msp430\usci.h. В моей версии все регистры для старших номеров портов закомментированы. crying.gif И это для mspgcc3 и 4. (смотрю на оба варианта)
MrYuran
CODE
#if !defined(__msp430_headers_usci_h__)
#define __msp430_headers_usci_h__

/* usi.h
*
* mspgcc project: MSP430 device headers
* USCI module header
*
* © 2006 by Steve Underwood <steveu@coppice.org>
* Originally based in part on work by Texas Instruments Inc.
*
* $Id: usci.h,v 1.7 2009/06/04 21:55:18 cliechti Exp $
*
* 2008-02-05 - modifications by G.Lemm <msp430@daqtix.com>
* - added UC1IE and UC1IFG registers
* - added UC*1*IE and UC*1*IFG bit definitions
* 2009-05-19 - modifications by S. Balling <praktikum@innoventis.de>
* - added switch for USCI0
* - added USCI0_5
* - added USCI1_5
* - added USCI2_5
* - added USCI3_5
*/

/* Switches:
__MSP430_HAS_USCI0__ - if device has USCI0
__MSP430_HAS_USCI1__ - if device has USCI1
__MSP430_HAS_USCI0_5__ - if device has USCI0 and is part of family 5
__MSP430_HAS_USCI1_5__ - if device has USCI1 and is part of family 5
__MSP430_HAS_USCI2_5__ - if device has USCI2 and is part of family 5
__MSP430_HAS_USCI3_5__ - if device has USCI3 and is part of family 5

*/

#define USIPE7 (0x80) /* USI Port Enable Px.7 */
#define USIPE6 (0x40) /* USI Port Enable Px.6 */
#define USIPE5 (0x20) /* USI Port Enable Px.5 */
#define USILSB (0x10) /* USI LSB first 1:LSB / 0:MSB */
#define USIMST (0x08) /* USI Master Select 0:Slave / 1:Master */
#define USIGE (0x04) /* USI General Output Enable Latch */
#define USIOE (0x02) /* USI Output Enable */
#define USISWRST (0x01) /* USI Software Reset */

#define USICKPH (0x80) /* USI Sync. Mode: Clock Phase */
#define USII2C (0x40) /* USI I2C Mode */
#define USISTTIE (0x20) /* USI START Condition interrupt enable */
#define USIIE (0x10) /* USI Counter Interrupt enable */
#define USIAL (0x08) /* USI Arbitration Lost */
#define USISTP (0x04) /* USI STOP Condition received */
#define USISTTIFG (0x02) /* USI START Condition interrupt Flag */
#define USIIFG (0x01) /* USI Counter Interrupt Flag */

#define USIDIV2 (0x80) /* USI Clock Divider 2 */
#define USIDIV1 (0x40) /* USI Clock Divider 1 */
#define USIDIV0 (0x20) /* USI Clock Divider 0 */
#define USISSEL2 (0x10) /* USI Clock Source Select 2 */
#define USISSEL1 (0x08) /* USI Clock Source Select 1 */
#define USISSEL0 (0x04) /* USI Clock Source Select 0 */
#define USICKPL (0x02) /* USI Clock Polarity 0:Inactive=Low / 1:Inactive=High */
#define USISWCLK (0x01) /* USI Software Clock */

#define USIDIV_0 (0x00) /* USI Clock Divider: 0 */
#define USIDIV_1 (0x20) /* USI Clock Divider: 1 */
#define USIDIV_2 (0x40) /* USI Clock Divider: 2 */
#define USIDIV_3 (0x60) /* USI Clock Divider: 3 */
#define USIDIV_4 (0x80) /* USI Clock Divider: 4 */
#define USIDIV_5 (0xA0) /* USI Clock Divider: 5 */
#define USIDIV_6 (0xC0) /* USI Clock Divider: 6 */
#define USIDIV_7 (0xE0) /* USI Clock Divider: 7 */

#define USISSEL_0 (0x00) /* USI Clock Source: 0 */
#define USISSEL_1 (0x04) /* USI Clock Source: 1 */
#define USISSEL_2 (0x08) /* USI Clock Source: 2 */
#define USISSEL_3 (0x0C) /* USI Clock Source: 3 */
#define USISSEL_4 (0x10) /* USI Clock Source: 4 */
#define USISSEL_5 (0x14) /* USI Clock Source: 5 */
#define USISSEL_6 (0x18) /* USI Clock Source: 6 */
#define USISSEL_7 (0x1C) /* USI Clock Source: 7 */

#define USISCLREL (0x80) /* USI SCL Released */
#define USI16B (0x40) /* USI 16 Bit Shift Register Enable */
#define USIFGDC (0x20) /* USI Interrupt Flag don't clear */
#define USICNT4 (0x10) /* USI Bit Count 4 */
#define USICNT3 (0x08) /* USI Bit Count 3 */
#define USICNT2 (0x04) /* USI Bit Count 2 */
#define USICNT1 (0x02) /* USI Bit Count 1 */
#define USICNT0 (0x01) /* USI Bit Count 0 */

// UART-Mode Bits
#define UCPEN (0x80) /* Async. Mode: Parity enable */
#define UCPAR (0x40) /* Async. Mode: Parity 0:odd / 1:even */
#define UCMSB (0x20) /* Async. Mode: MSB first 0:LSB / 1:MSB */
#define UC7BIT (0x10) /* Async. Mode: Data Bits 0:8-bits / 1:7-bits */
#define UCSPB (0x08) /* Async. Mode: Stop Bits 0:one / 1: two */
#define UCMODE1 (0x04) /* Async. Mode: USCI Mode 1 */
#define UCMODE0 (0x02) /* Async. Mode: USCI Mode 0 */
#define UCSYNC (0x01) /* Sync-Mode 0:UART-Mode / 1:SPI-Mode */

// SPI-Mode Bits
#define UCCKPH (0x80) /* Sync. Mode: Clock Phase */
#define UCCKPL (0x40) /* Sync. Mode: Clock Polarity */
#define UCMST (0x08) /* Sync. Mode: Master Select */

// I2C-Mode Bits
#define UCA10 (0x80) /* 10-bit Address Mode */
#define UCSLA10 (0x40) /* 10-bit Slave Address Mode */
#define UCMM (0x20) /* Multi-Master Environment */
//#define res (0x10) /* reserved */
#define UCMODE_0 (0<<1) /* Sync. Mode: USCI Mode: 0 */
#define UCMODE_1 (1<<1) /* Sync. Mode: USCI Mode: 1 */
#define UCMODE_2 (2<<1) /* Sync. Mode: USCI Mode: 2 */
#define UCMODE_3 (3<<1) /* Sync. Mode: USCI Mode: 3 */

// UART-Mode Bits
#define UCSSEL1 (0x80) /* USCI 0 Clock Source Select 1 */
#define UCSSEL0 (0x40) /* USCI 0 Clock Source Select 0 */
#define UCRXEIE (0x20) /* RX Error interrupt enable */
#define UCBRKIE (0x10) /* Break interrupt enable */
#define UCDORM (0x08) /* Dormant (Sleep) Mode */
#define UCTXADDR (0x04) /* Send next Data as Address */
#define UCTXBRK (0x02) /* Send next Data as Break */
#define UCSWRST (0x01) /* USCI Software Reset */

// SPI-Mode Bits
//#define res (0x20) /* reserved */
//#define res (0x10) /* reserved */
//#define res (0x08) /* reserved */
//#define res (0x04) /* reserved */
//#define res (0x02) /* reserved */

// I2C-Mode Bits
//#define res (0x20) /* reserved */
#define UCTR (0x10) /* Transmit/Receive Select/Flag */
#define UCTXNACK (0x08) /* Transmit NACK */
#define UCTXSTP (0x04) /* Transmit STOP */
#define UCTXSTT (0x02) /* Transmit START */
#define UCSSEL_0 (0<<6) /* USCI 0 Clock Source: 0 */
#define UCSSEL_1 (1<<6) /* USCI 0 Clock Source: 1 */
#define UCSSEL_2 (2<<6) /* USCI 0 Clock Source: 2 */
#define UCSSEL_3 (3<<6) /* USCI 0 Clock Source: 3 */

#define UCBRF3 (0x80) /* USCI First Stage Modulation Select 3 */
#define UCBRF2 (0x40) /* USCI First Stage Modulation Select 2 */
#define UCBRF1 (0x20) /* USCI First Stage Modulation Select 1 */
#define UCBRF0 (0x10) /* USCI First Stage Modulation Select 0 */
#define UCBRS2 (0x08) /* USCI Second Stage Modulation Select 2 */
#define UCBRS1 (0x04) /* USCI Second Stage Modulation Select 1 */
#define UCBRS0 (0x02) /* USCI Second Stage Modulation Select 0 */
#define UCOS16 (0x01) /* USCI 16-times Oversampling enable */

#define UCBRF_0 (0x0<<4) /* USCI First Stage Modulation: 0 */
#define UCBRF_1 (0x1<<4) /* USCI First Stage Modulation: 1 */
#define UCBRF_2 (0x2<<4) /* USCI First Stage Modulation: 2 */
#define UCBRF_3 (0x3<<4) /* USCI First Stage Modulation: 3 */
#define UCBRF_4 (0x4<<4) /* USCI First Stage Modulation: 4 */
#define UCBRF_5 (0x5<<4) /* USCI First Stage Modulation: 5 */
#define UCBRF_6 (0x6<<4) /* USCI First Stage Modulation: 6 */
#define UCBRF_7 (0x7<<4) /* USCI First Stage Modulation: 7 */
#define UCBRF_8 (0x8<<4) /* USCI First Stage Modulation: 8 */
#define UCBRF_9 (0x9<<4) /* USCI First Stage Modulation: 9 */
#define UCBRF_10 (0xA<<4) /* USCI First Stage Modulation: A */
#define UCBRF_11 (0xB<<4) /* USCI First Stage Modulation: B */
#define UCBRF_12 (0xC<<4) /* USCI First Stage Modulation: C */
#define UCBRF_13 (0xD<<4) /* USCI First Stage Modulation: D */
#define UCBRF_14 (0xE<<4) /* USCI First Stage Modulation: E */
#define UCBRF_15 (0xF<<4) /* USCI First Stage Modulation: F */

#define UCBRS_0 (0<<1) /* USCI Second Stage Modulation: 0 */
#define UCBRS_1 (1<<1) /* USCI Second Stage Modulation: 1 */
#define UCBRS_2 (2<<1) /* USCI Second Stage Modulation: 2 */
#define UCBRS_3 (3<<1) /* USCI Second Stage Modulation: 3 */
#define UCBRS_4 (4<<1) /* USCI Second Stage Modulation: 4 */
#define UCBRS_5 (5<<1) /* USCI Second Stage Modulation: 5 */
#define UCBRS_6 (6<<1) /* USCI Second Stage Modulation: 6 */
#define UCBRS_7 (7<<1) /* USCI Second Stage Modulation: 7 */

#define UCLISTEN (0x80) /* USCI Listen mode */
#define UCFE (0x40) /* USCI Frame Error Flag */
#define UCOE (0x20) /* USCI Overrun Error Flag */
#define UCPE (0x10) /* USCI Parity Error Flag */
#define UCBRK (0x08) /* USCI Break received */
#define UCRXERR (0x04) /* USCI RX Error Flag */
#define UCADDR (0x02) /* USCI Address received Flag */
#define UCBUSY (0x01) /* USCI Busy Flag */
#define UCIDLE (0x02) /* USCI Idle line detected Flag */

//#define res (0x80) /* reserved */
//#define res (0x40) /* reserved */
//#define res (0x20) /* reserved */
//#define res (0x10) /* reserved */
#define UCNACKIE (0x08) /* NACK Condition interrupt enable */
#define UCSTPIE (0x04) /* STOP Condition interrupt enable */
#define UCSTTIE (0x02) /* START Condition interrupt enable */
#define UCALIE (0x01) /* Arbitration Lost interrupt enable */

#define UCSCLLOW (0x40) /* SCL low */
#define UCGC (0x20) /* General Call address received Flag */
#define UCBBUSY (0x10) /* Bus Busy Flag */
#define UCNACKIFG (0x08) /* NAK Condition interrupt Flag */
#define UCSTPIFG (0x04) /* STOP Condition interrupt Flag */
#define UCSTTIFG (0x02) /* START Condition interrupt Flag */
#define UCALIFG (0x01) /* Arbitration Lost interrupt Flag */

#define UCIRTXPL5 (0x80) /* IRDA Transmit Pulse Length 5 */
#define UCIRTXPL4 (0x40) /* IRDA Transmit Pulse Length 4 */
#define UCIRTXPL3 (0x20) /* IRDA Transmit Pulse Length 3 */
#define UCIRTXPL2 (0x10) /* IRDA Transmit Pulse Length 2 */
#define UCIRTXPL1 (0x08) /* IRDA Transmit Pulse Length 1 */
#define UCIRTXPL0 (0x04) /* IRDA Transmit Pulse Length 0 */
#define UCIRTXCLK (0x02) /* IRDA Transmit Pulse Clock Select */
#define UCIREN (0x01) /* IRDA Encoder/Decoder enable */

#define UCIRRXFL5 (0x80) /* IRDA Receive Filter Length 5 */
#define UCIRRXFL4 (0x40) /* IRDA Receive Filter Length 4 */
#define UCIRRXFL3 (0x20) /* IRDA Receive Filter Length 3 */
#define UCIRRXFL2 (0x10) /* IRDA Receive Filter Length 2 */
#define UCIRRXFL1 (0x08) /* IRDA Receive Filter Length 1 */
#define UCIRRXFL0 (0x04) /* IRDA Receive Filter Length 0 */
#define UCIRRXPL (0x02) /* IRDA Receive Input Polarity */
#define UCIRRXFE (0x01) /* IRDA Receive Filter enable */

//#define res (0x80) /* reserved */
//#define res (0x40) /* reserved */
#define UCDELIM1 (0x20) /* Break Sync Delimiter 1 */
#define UCDELIM0 (0x10) /* Break Sync Delimiter 0 */
#define UCSTOE (0x08) /* Sync-Field Timeout error */
#define UCBTOE (0x04) /* Break Timeout error */
//#define res (0x02) /* reserved */
#define UCABDEN (0x01) /* Auto Baud Rate detect enable */

#define UCGCEN (0x8000) /* I2C General Call enable */
#define UCOA9 (0x0200) /* I2C Own Address 9 */
#define UCOA8 (0x0100) /* I2C Own Address 8 */
#define UCOA7 (0x0080) /* I2C Own Address 7 */
#define UCOA6 (0x0040) /* I2C Own Address 6 */
#define UCOA5 (0x0020) /* I2C Own Address 5 */
#define UCOA4 (0x0010) /* I2C Own Address 4 */
#define UCOA3 (0x0008) /* I2C Own Address 3 */
#define UCOA2 (0x0004) /* I2C Own Address 2 */
#define UCOA1 (0x0002) /* I2C Own Address 1 */
#define UCOA0 (0x0001) /* I2C Own Address 0 */

#define UCSA9 (0x0200) /* I2C Slave Address 9 */
#define UCSA8 (0x0100) /* I2C Slave Address 8 */
#define UCSA7 (0x0080) /* I2C Slave Address 7 */
#define UCSA6 (0x0040) /* I2C Slave Address 6 */
#define UCSA5 (0x0020) /* I2C Slave Address 5 */
#define UCSA4 (0x0010) /* I2C Slave Address 4 */
#define UCSA3 (0x0008) /* I2C Slave Address 3 */
#define UCSA2 (0x0004) /* I2C Slave Address 2 */
#define UCSA1 (0x0002) /* I2C Slave Address 1 */
#define UCSA0 (0x0001) /* I2C Slave Address 0 */

/* Aliases by mspgcc */
#define UCSSEL_UCLKI UCSSEL_0
#define UCSSEL_ACLK UCSSEL_1
#define UCSSEL_SMCLK UCSSEL_2

#if defined(__MSP430_HAS_USCI0__)

/* -------- USCI0 */

#define UCA0CTL0_ 0x0060 /* USCI A0 Control Register 0 */
sfrb(UCA0CTL0, UCA0CTL0_);
#define UCA0CTL1_ 0x0061 /* USCI A0 Control Register 1 */
sfrb(UCA0CTL1, UCA0CTL1_);
#define UCA0BR0_ 0x0062 /* USCI A0 Baud Rate 0 */
sfrb(UCA0BR0, UCA0BR0_);
#define UCA0BR1_ 0x0063 /* USCI A0 Baud Rate 1 */
sfrb(UCA0BR1, UCA0BR1_);
#define UCA0MCTL_ 0x0064 /* USCI A0 Modulation Control */
sfrb(UCA0MCTL, UCA0MCTL_);
#define UCA0STAT_ 0x0065 /* USCI A0 Status Register */
sfrb(UCA0STAT, UCA0STAT_);
#define UCA0RXBUF_ 0x0066 /* USCI A0 Receive Buffer */
/*READ_ONLY*/ sfrb(UCA0RXBUF, UCA0RXBUF_);
#define UCA0TXBUF_ 0x0067 /* USCI A0 Transmit Buffer */
sfrb(UCA0TXBUF, UCA0TXBUF_);
#define UCA0ABCTL_ 0x005D /* USCI A0 Auto baud/LIN Control */
sfrb(UCA0ABCTL, UCA0ABCTL_);
#define UCA0IRTCTL_ 0x005E /* USCI A0 IrDA Transmit Control */
sfrb(UCA0IRTCTL, UCA0IRTCTL_);
#define UCA0IRRCTL_ 0x005F /* USCI A0 IrDA Receive Control */
sfrb(UCA0IRRCTL, UCA0IRRCTL_);

#define UCB0CTL0_ 0x0068 /* USCI B0 Control Register 0 */
sfrb(UCB0CTL0, UCB0CTL0_);
#define UCB0CTL1_ 0x0069 /* USCI B0 Control Register 1 */
sfrb(UCB0CTL1, UCB0CTL1_);
#define UCB0BR0_ 0x006A /* USCI B0 Baud Rate 0 */
sfrb(UCB0BR0, UCB0BR0_);
#define UCB0BR1_ 0x006B /* USCI B0 Baud Rate 1 */
sfrb(UCB0BR1, UCB0BR1_);
#define UCB0I2CIE_ 0x006C /* USCI B0 I2C Interrupt Enable Register */
sfrb(UCB0I2CIE, UCB0I2CIE_);
#define UCB0STAT_ 0x006D /* USCI B0 Status Register */
sfrb(UCB0STAT, UCB0STAT_);
#define UCB0RXBUF_ 0x006E /* USCI B0 Receive Buffer */
/*READ_ONLY*/ sfrb(UCB0RXBUF, UCB0RXBUF_);
#define UCB0TXBUF_ 0x006F /* USCI B0 Transmit Buffer */
sfrb(UCB0TXBUF, UCB0TXBUF_);
#define UCB0I2COA_ 0x0118 /* USCI B0 I2C Own Address */
sfrw(UCB0I2COA, UCB0I2COA_);
#define UCB0I2CSA_ 0x011A /* USCI B0 I2C Slave Address */
sfrw(UCB0I2CSA, UCB0I2CSA_);
#endif /* __MSP430_HAS_USCI0__ */

#if defined(__MSP430_HAS_USCI1__)

/* -------- USCI1 */

#define UCA1CTL0_ 0x00D0 /* USCI A1 Control Register 0 */
sfrb(UCA1CTL0, UCA1CTL0_);
#define UCA1CTL1_ 0x00D1 /* USCI A1 Control Register 1 */
sfrb(UCA1CTL1, UCA1CTL1_);
#define UCA1BR0_ 0x00D2 /* USCI A1 Baud Rate 0 */
sfrb(UCA1BR0, UCA1BR0_);
#define UCA1BR1_ 0x00D3 /* USCI A1 Baud Rate 1 */
sfrb(UCA1BR1, UCA1BR1_);
#define UCA1MCTL_ 0x00D4 /* USCI A1 Modulation Control */
sfrb(UCA1MCTL, UCA1MCTL_);
#define UCA1STAT_ 0x00D5 /* USCI A1 Status Register */
sfrb(UCA1STAT, UCA1STAT_);
#define UCA1RXBUF_ 0x00D6 /* USCI A1 Receive Buffer */
/*READ_ONLY*/ sfrb(UCA1RXBUF, UCA1RXBUF_);
#define UCA1TXBUF_ 0x00D7 /* USCI A1 Transmit Buffer */
sfrb(UCA1TXBUF, UCA1TXBUF_);
#define UCA1ABCTL_ 0x00CD /* USCI A1 Auto baud/LIN Control */
sfrb(UCA1ABCTL, UCA1ABCTL_);
#define UCA1IRTCTL_ 0x00CE /* USCI A1 IrDA Transmit Control */
sfrb(UCA1IRTCTL, UCA1IRTCTL_);
#define UCA1IRRCTL_ 0x00CF /* USCI A1 IrDA Receive Control */
sfrb(UCA1IRRCTL, UCA1IRRCTL_);

#define UCB1CTL0_ 0x00D8 /* USCI B1 Control Register 0 */
sfrb(UCB1CTL0, UCB1CTL0_);
#define UCB1CTL1_ 0x00D9 /* USCI B1 Control Register 1 */
sfrb(UCB1CTL1, UCB1CTL1_);
#define UCB1BR0_ 0x00DA /* USCI B1 Baud Rate 0 */
sfrb(UCB1BR0, UCB1BR0_);
#define UCB1BR1_ 0x00DB /* USCI B1 Baud Rate 1 */
sfrb(UCB1BR1, UCB1BR1_);
#define UCB1I2CIE_ 0x00DC /* USCI B1 I2C Interrupt Enable Register */
sfrb(UCB1I2CIE, UCB1I2CIE_);
#define UCB1STAT_ 0x00DD /* USCI B1 Status Register */
sfrb(UCB1STAT, UCB1STAT_);
#define UCB1RXBUF_ 0x00DE /* USCI B1 Receive Buffer */
/*READ_ONLY*/ sfrb(UCB1RXBUF, UCB1RXBUF_);
#define UCB1TXBUF_ 0x00DF /* USCI B1 Transmit Buffer */
sfrb(UCB1TXBUF, UCB1TXBUF_);
#define UCB1I2COA_ 0x017C /* USCI B1 I2C Own Address */
sfrw(UCB1I2COA, UCB1I2COA_);
#define UCB1I2CSA_ 0x017E /* USCI B1 I2C Slave Address */
sfrw(UCB1I2CSA, UCB1I2CSA_);

#define UC1IE_ 0x0006 /* USCI A1/B1 Interrupt enable register */
sfrb(UC1IE, UC1IE_);
#define UC1IFG_ 0x0007 /* USCI A1/B1 Interrupt flag register */
sfrb(UC1IFG, UC1IFG_);

#define UCA1RXIE (1<<0)
#define UCA1TXIE (1<<1)
#define UCB1RXIE (1<<2)
#define UCB1TXIE (1<<3)

#define UCA1RXIFG (1<<0)
#define UCA1TXIFG (1<<1)
#define UCB1RXIFG (1<<2)
#define UCB1TXIFG (1<<3)
#endif /* __MSP430_HAS_USCI1__ */

#if defined(__MSP430_HAS_USCI0_5__)

/* -------- USCI0_5 */

#define UCA0CTL0_ 0x05C1
sfrb(UCA0CTL0, UCA0CTL0_);
#define UCA0CTL1_ 0x05C0
sfrb(UCA0CTL1, UCA0CTL1_);
#define UCA0BR0_ 0x05C6
sfrb(UCA0BR0, UCA0BR0_);
#define UCA0BR1_ 0x05C7
sfrb(UCA0BR1, UCA0BR1_);
#define UCA0MCTL_ 0x05C8
sfrb(UCA0MCTL, UCA0MCTL_);
#define UCA0STAT_ 0x05CA
sfrb(UCA0STAT, UCA0STAT_);
#define UCA0RXBUF_ 0x05CC
sfrb(UCA0RXBUF, UCA0RXBUF_);
#define UCA0TXBUF_ 0x05CE
sfrb(UCA0TXBUF, UCA0TXBUF_);
#define UCA0ABCTL_ 0x05D0
sfrb(UCA0ABCTL, UCA0ABCTL_);
#define UCA0IRTCTL_ 0x05D2
sfrb(UCA0IRTCTL, UCA0IRTCTL_);
#define UCA0IRRCTL_ 0x05D3
sfrb(UCA0IRRCTL, UCA0IRRCTL_);
#define UCA0IE_ 0x05DC
sfrb(UCA0IE, UCA0IE_);
#define UCA0IFG_ 0x05DD
sfrb(UCA0IFG, UCA0IFG_);
#define UCA0IV_ 0x05DE
sfrw(UCA0IV, UCA0IV_);
#define UCA0IV_L_ 0x05DE
sfrb(UCA0IV_L, UCA0IV_L_);
#define UCA0IV_H_ 0x05DF
sfrb(UCA0IV_H, UCA0IV_H_);

#define UCB0CTL0_ 0x05E1
sfrb(UCB0CTL0, UCB0CTL0_);
#define UCB0CTL1_ 0x05E0
sfrb(UCB0CTL1, UCB0CTL1_);
#define UCB0BR0_ 0x05E6
sfrb(UCB0BR0, UCB0BR0_);
#define UCB0BR1_ 0x05E7
sfrb(UCB0BR1, UCB0BR1_);
#define UCB0MCTL_ 0x05E8
sfrb(UCB0MCTL, UCB0MCTL_);
#define UCB0STAT_ 0x05EA
sfrb(UCB0STAT, UCB0STAT_);
#define UCB0RXBUF_ 0x05EC
sfrb(UCB0RXBUF, UCB0RXBUF_);
#define UCB0TXBUF_ 0x05EE
sfrb(UCB0TXBUF, UCB0TXBUF_);
#define UCB0I2COA_ 0x05F0
sfrb(UCB0I2COA, UCB0I2COA_);
#define UCB0I2CSA_ 0x05F2
sfrb(UCB0I2CSA, UCB0I2CSA_);
#define UCB0IE_ 0x05FC
sfrb(UCB0IE, UCB0IE_);
#define UCB0IFG_ 0x05FD
sfrb(UCB0IFG, UCB0IFG_);
#define UCB0IV_ 0x05FE
sfrw(UCB0IV, UCB0IV_);
#define UCB0IV_L_ 0x05FE
sfrb(UCB0IV_L, UCB0IV_L_);
#define UCB0IV_H_ 0x05FF
sfrb(UCB0IV_H, UCB0IV_H_);

#endif /* __MSP430_HAS_USCI0_5__ */

#if defined(__MSP430_HAS_USCI1_5__)

/* -------- USCI1_5 */

// tbd
/*#define UCA1CTL0_ 0x0601
#define UCA1CTL0_L 0x0601
#define UCA1CTL0_H 0x0602
#define UCA1CTL1_ 0x0600
#define UCA1CTL1_L 0x0600
#define UCA1CTL1_H 0x0601
#define UCA1BR0_ 0x0606
#define UCA1BR0_L 0x0606
#define UCA1BR0_H 0x0607
#define UCA1BR1_ 0x0607
#define UCA1BR1_L 0x0607
#define UCA1BR1_H 0x0608
#define UCA1MCTL_ 0x0608
#define UCA1MCTL_L 0x0608
#define UCA1MCTL_H 0x0609
#define UCA1STAT_ 0x060A
#define UCA1STAT_L 0x060A
#define UCA1STAT_H 0x060B
#define UCA1RXBUF 0x060C
#define UCA1RXBUF_L 0x060C
#define UCA1RXBUF_H 0x060D
#define UCA1TXBUF 0x060E
#define UCA1TXBUF_L 0x060E
#define UCA1TXBUF_H 0x060F
#define UCA1ABCTL 0x0610
#define UCA1ABCTL_L 0x0610
#define UCA1ABCTL_H 0x0611
#define UCA1IRTCTL 0x0612
#define UCA1IRTCTL_L 0x0612
#define UCA1IRTCTL_H 0x0613
#define UCA1IRRCTL 0x0613
#define UCA1IRRCTL_L 0x0613
#define UCA1IRRCTL_H 0x0614
#define UCA1IE_ 0x061C
#define UCA1IE_L_ 0x061C
#define UCA1IE_H_ 0x061D
#define UCA1IFG_ 0x061D
#define UCA1IFG_L 0x061D
#define UCA1IFG_H 0x061E
#define UCA1IV_ 0x061E
#define UCA1IV_L_ 0x061E
#define UCA1IV_H_ 0x061F
#define UCB1CTL0_ 0x0621
#define UCB1CTL0_L 0x0621
#define UCB1CTL0_H 0x0622
#define UCB1CTL1_ 0x0620
#define UCB1CTL1_L 0x0620
#define UCB1CTL1_H 0x0621
#define UCB1BR0_ 0x0626
#define UCB1BR0_L 0x0626
#define UCB1BR0_H 0x0627
#define UCB1BR1_ 0x0627
#define UCB1BR1_L 0x0627
#define UCB1BR1_H 0x0628
#define UCB1STAT_ 0x062A
#define UCB1STAT_L 0x062A
#define UCB1STAT_H 0x062B
#define UCB1RXBUF 0x062C
#define UCB1RXBUF_L 0x062C
#define UCB1RXBUF_H 0x062D
#define UCB1TXBUF 0x062E
#define UCB1TXBUF_L 0x062E
#define UCB1TXBUF_H 0x062F
#define UCB1I2COA 0x0630
#define UCB1I2COA_L 0x0630
#define UCB1I2COA_H 0x0631
#define UCB1I2CSA 0x0632
#define UCB1I2CSA_L 0x0632
#define UCB1I2CSA_H 0x0633
#define UCB1IE_ 0x063C
#define UCB1IE_L_ 0x063C
#define UCB1IE_H_ 0x063D
#define UCB1IFG_ 0x063D
#define UCB1IFG_L 0x063D
#define UCB1IFG_H 0x063E
#define UCB1IV_ 0x063E
#define UCB1IV_L_ 0x063E
#define UCB1IV_H_ 0x063F
*/
#endif /* __MSP430_HAS_USCI1_5__ */

#if defined(__MSP430_HAS_USCI2_5__)

/* -------- USCI2_5 */

// tbd
/*#define UCA2CTL0_ 0x0641
#define UCA2CTL0_L 0x0641
#define UCA2CTL0_H 0x0642
#define UCA2CTL1_ 0x0640
#define UCA2CTL1_L 0x0640
#define UCA2CTL1_H 0x0641
#define UCA2BR0_ 0x0646
#define UCA2BR0_L 0x0646
#define UCA2BR0_H 0x0647
#define UCA2BR1_ 0x0647
#define UCA2BR1_L 0x0647
#define UCA2BR1_H 0x0648
#define UCA2MCTL_ 0x0648
#define UCA2MCTL_L 0x0648
#define UCA2MCTL_H 0x0649
#define UCA2STAT_ 0x064A
#define UCA2STAT_L 0x064A
#define UCA2STAT_H 0x064B
#define UCA2RXBUF 0x064C
#define UCA2RXBUF_L 0x064C
#define UCA2RXBUF_H 0x064D
#define UCA2TXBUF 0x064E
#define UCA2TXBUF_L 0x064E
#define UCA2TXBUF_H 0x064F
#define UCA2ABCTL 0x0650
#define UCA2ABCTL_L 0x0650
#define UCA2ABCTL_H 0x0651
#define UCA2IRTCTL 0x0652
#define UCA2IRTCTL_L 0x0652
#define UCA2IRTCTL_H 0x0653
#define UCA2IRRCTL 0x0653
#define UCA2IRRCTL_L 0x0653
#define UCA2IRRCTL_H 0x0654
#define UCA2IE_ 0x065C
#define UCA2IE_L_ 0x065C
#define UCA2IE_H_ 0x065D
#define UCA2IFG_ 0x065D
#define UCA2IFG_L 0x065D
#define UCA2IFG_H 0x065E
#define UCA2IV_ 0x065E
#define UCA2IV_L_ 0x065E
#define UCA2IV_H_ 0x065F
#define UCB2CTL0_ 0x0661
#define UCB2CTL0_L 0x0661
#define UCB2CTL0_H 0x0662
#define UCB2CTL1_ 0x0660
#define UCB2CTL1_L 0x0660
#define UCB2CTL1_H 0x0661
#define UCB2BR0_ 0x0666
#define UCB2BR0_L 0x0666
#define UCB2BR0_H 0x0667
#define UCB2BR1_ 0x0667
#define UCB2BR1_L 0x0667
#define UCB2BR1_H 0x0668
#define UCB2STAT_ 0x066A
#define UCB2STAT_L 0x066A
#define UCB2STAT_H 0x066B
#define UCB2RXBUF 0x066C
#define UCB2RXBUF_L 0x066C
#define UCB2RXBUF_H 0x066D
#define UCB2TXBUF 0x066E
#define UCB2TXBUF_L 0x066E
#define UCB2TXBUF_H 0x066F
#define UCB2I2COA 0x0670
#define UCB2I2COA_L 0x0670
#define UCB2I2COA_H 0x0671
#define UCB2I2CSA 0x0672
#define UCB2I2CSA_L 0x0672
#define UCB2I2CSA_H 0x0673
#define UCB2IE_ 0x067C
#define UCB2IE_L_ 0x067C
#define UCB2IE_H_ 0x067D
#define UCB2IFG_ 0x067D
#define UCB2IFG_L 0x067D
#define UCB2IFG_H 0x067E
#define UCB2IV_ 0x067E
#define UCB2IV_L_ 0x067E
#define UCB2IV_H_ 0x067F
*/
#endif /* __MSP430_HAS_USCI2_5__ */

#if defined(__MSP430_HAS_USCI3_5__)

/* -------- USCI3_5 */
// tbd
/*#define UCA3CTL0_ 0x0681
#define UCA3CTL0_L 0x0681
#define UCA3CTL0_H 0x0682
#define UCA3CTL1_ 0x0680
#define UCA3CTL1_L 0x0680
#define UCA3CTL1_H 0x0681
#define UCA3BR0_ 0x0686
#define UCA3BR0_L 0x0686
#define UCA3BR0_H 0x0687
#define UCA3BR1_ 0x0687
#define UCA3BR1_L 0x0687
#define UCA3BR1_H 0x0688
#define UCA3MCTL_ 0x0688
#define UCA3MCTL_L 0x0688
#define UCA3MCTL_H 0x0689
#define UCA3STAT_ 0x068A
#define UCA3STAT_L 0x068A
#define UCA3STAT_H 0x068B
#define UCA3RXBUF 0x068C
#define UCA3RXBUF_L 0x068C
#define UCA3RXBUF_H 0x068D
#define UCA3TXBUF 0x068E
#define UCA3TXBUF_L 0x068E
#define UCA3TXBUF_H 0x068F
#define UCA3ABCTL 0x0690
#define UCA3ABCTL_L 0x0690
#define UCA3ABCTL_H 0x0691
#define UCA3IRTCTL 0x0692
#define UCA3IRTCTL_L 0x0692
#define UCA3IRTCTL_H 0x0693
#define UCA3IRRCTL 0x0693
#define UCA3IRRCTL_L 0x0693
#define UCA3IRRCTL_H 0x0694
#define UCA3IE_ 0x069C
#define UCA3IE_L_ 0x069C
#define UCA3IE_H_ 0x069D
#define UCA3IFG_ 0x069D
#define UCA3IFG_L 0x069D
#define UCA3IFG_H 0x069E
#define UCA3IV_ 0x069E
#define UCA3IV_L_ 0x069E
#define UCA3IV_H_ 0x069F
#define UCB3CTL0_ 0x06A1
#define UCB3CTL0_L 0x06A1
#define UCB3CTL0_H 0x06A2
#define UCB3CTL1_ 0x06A0
#define UCB3CTL1_L 0x06A0
#define UCB3CTL1_H 0x06A1
#define UCB3BR0_ 0x06A6
#define UCB3BR0_L 0x06A6
#define UCB3BR0_H 0x06A7
#define UCB3BR1_ 0x06A7
#define UCB3BR1_L 0x06A7
#define UCB3BR1_H 0x06A8
#define UCB3STAT_ 0x06AA
#define UCB3STAT_L 0x06AA
#define UCB3STAT_H 0x06AB
#define UCB3RXBUF 0x06AC
#define UCB3RXBUF_L 0x06AC
#define UCB3RXBUF_H 0x06AD
#define UCB3TXBUF 0x06AE
#define UCB3TXBUF_L 0x06AE
#define UCB3TXBUF_H 0x06AF
#define UCB3I2COA 0x06B0
#define UCB3I2COA_L 0x06B0
#define UCB3I2COA_H 0x06B1
#define UCB3I2CSA 0x06B2
#define UCB3I2CSA_L 0x06B2
#define UCB3I2CSA_H 0x06B3
#define UCB3IE_ 0x06BC
#define UCB3IE_L_ 0x06BC
#define UCB3IE_H_ 0x06BD
#define UCB3IFG_ 0x06BD
#define UCB3IFG_L 0x06BD
#define UCB3IFG_H 0x06BE
#define UCB3IV_ 0x06BE
#define UCB3IV_L_ 0x06BE
#define UCB3IV_H_ 0x06BF
*/
#endif /* __MSP430_HAS_USCI3_5__ */

#endif

Прогресс прогрессирует?
Сергей Борщ
Цитата(MrYuran @ Nov 6 2009, 12:14) *
Кстати, для 54хх хедеры лежат без комментиариев, может уже и работают...
если вы зайдете в репозиторий mspgcc4, то увидите, что файлы msp430-libc там отсутствуют. Они цельнотянуты из mspgcc. А заглянув в репозиторий mspgcc можно легко проследить состояние каждого файла. Там видно, что последняя правка была в июне - добавили таймер A, тактирование и usart.

P.S. Вы так настойчиво ждете каких-то дополнений в этом файле, что можно было уже 10 раз написать их самостоятельно, оттестировать и послать патч Крису.
P.P.S. В списке рассылки проскакивала информация, что репозиторий будут перетаскивать под bazaar. Чем закончилось - не знаю.
mdmitry
Цитата(MrYuran @ Nov 6 2009, 15:49) *
CODE
#if !defined(__msp430_headers_usci_h__)
#if defined(__MSP430_HAS_USCI3_5__)

/* -------- USCI3_5 */
// tbd
/*#define UCA3CTL0_ 0x0681 <!!!!!!!!!!!!!!!! comment begin
#define UCA3CTL0_L 0x0681
#define UCA3CTL0_H 0x0682
#define UCA3CTL1_ 0x0680
#define UCA3CTL1_L 0x0680
#define UCA3CTL1_H 0x0681
#define UCA3BR0_ 0x0686
#define UCA3BR0_L 0x0686
#define UCA3BR0_H 0x0687
#define UCA3BR1_ 0x0687
#define UCA3BR1_L 0x0687
#define UCA3BR1_H 0x0688
#define UCA3MCTL_ 0x0688
#define UCA3MCTL_L 0x0688
#define UCA3MCTL_H 0x0689
#define UCA3STAT_ 0x068A
#define UCA3STAT_L 0x068A
#define UCA3STAT_H 0x068B
#define UCA3RXBUF 0x068C
#define UCA3RXBUF_L 0x068C
#define UCA3RXBUF_H 0x068D
#define UCA3TXBUF 0x068E
#define UCA3TXBUF_L 0x068E
#define UCA3TXBUF_H 0x068F
#define UCA3ABCTL 0x0690
#define UCA3ABCTL_L 0x0690
#define UCA3ABCTL_H 0x0691
#define UCA3IRTCTL 0x0692
#define UCA3IRTCTL_L 0x0692
#define UCA3IRTCTL_H 0x0693
#define UCA3IRRCTL 0x0693
#define UCA3IRRCTL_L 0x0693
#define UCA3IRRCTL_H 0x0694
#define UCA3IE_ 0x069C
#define UCA3IE_L_ 0x069C
#define UCA3IE_H_ 0x069D
#define UCA3IFG_ 0x069D
#define UCA3IFG_L 0x069D
#define UCA3IFG_H 0x069E
#define UCA3IV_ 0x069E
#define UCA3IV_L_ 0x069E
#define UCA3IV_H_ 0x069F
#define UCB3CTL0_ 0x06A1
#define UCB3CTL0_L 0x06A1
#define UCB3CTL0_H 0x06A2
#define UCB3CTL1_ 0x06A0
#define UCB3CTL1_L 0x06A0
#define UCB3CTL1_H 0x06A1
#define UCB3BR0_ 0x06A6
#define UCB3BR0_L 0x06A6
#define UCB3BR0_H 0x06A7
#define UCB3BR1_ 0x06A7
#define UCB3BR1_L 0x06A7
#define UCB3BR1_H 0x06A8
#define UCB3STAT_ 0x06AA
#define UCB3STAT_L 0x06AA
#define UCB3STAT_H 0x06AB
#define UCB3RXBUF 0x06AC
#define UCB3RXBUF_L 0x06AC
#define UCB3RXBUF_H 0x06AD
#define UCB3TXBUF 0x06AE
#define UCB3TXBUF_L 0x06AE
#define UCB3TXBUF_H 0x06AF
#define UCB3I2COA 0x06B0
#define UCB3I2COA_L 0x06B0
#define UCB3I2COA_H 0x06B1
#define UCB3I2CSA 0x06B2
#define UCB3I2CSA_L 0x06B2
#define UCB3I2CSA_H 0x06B3
#define UCB3IE_ 0x06BC
#define UCB3IE_L_ 0x06BC
#define UCB3IE_H_ 0x06BD
#define UCB3IFG_ 0x06BD
#define UCB3IFG_L 0x06BD
#define UCB3IFG_H 0x06BE
#define UCB3IV_ 0x06BE
#define UCB3IV_L_ 0x06BE
#define UCB3IV_H_ 0x06BF
*/ <!!!!!!!!!!!!!!!! comment end
#endif /* __MSP430_HAS_USCI3_5__ */

#endif

Прогресс прогрессирует?

Указал на пример комментариев в файле.

Цитата(Сергей Борщ @ Nov 6 2009, 16:09) *
P.S. Вы так настойчиво ждете каких-то дополнений в этом файле, что можно было уже 10 раз написать их самостоятельно, оттестировать и послать патч Крису.
P.P.S. В списке рассылки проскакивала информация, что репозиторий будут перетаскивать под bazaar. Чем закончилось - не знаю.

Когда (?) будет время, то хочу попробовать собрать для MSP-EXP430F5438 демонстрационный пример, скорректировав исходный код IAR (CCE). Для этого надо иметь _полный_ комплект описаний регистров в заголовочных файлах.
Сергей Борщ
Цитата(mdmitry @ Nov 6 2009, 15:56) *
Для этого надо иметь _полный_ комплект описаний регистров в заголовочных файлах.
Так возьмите и допишите. Это не архисложная задача - читать даташит и вписывать из него #define, она не требует знания потрохов компилятора. А чтобы другие не изобретали велосипед - поделитесь результатом своих трудов.
mdmitry
Цитата(Сергей Борщ @ Nov 6 2009, 18:10) *
Так возьмите и допишите. Это не архисложная задача - читать даташит и вписывать из него #define, она не требует знания потрохов компилятора. А чтобы другие не изобретали велосипед - поделитесь результатом своих трудов.

Есть один момент, который сильно смущает. Насколько я представляю, в gcc принята некоторая система в организации заголовочных файлов, связанных с функциональными модулями (usart и другие). Для конкретного контроллера заголовочных файлов несколько и они связаны между собой через определения доступной периферии. Имеется прецедент в виде файла gpio_5xxx.h специально для этой серии. На мой взгляд и остальная периферия получается в этом же виде (отдельные файлы hardmodulname_54xxx.h). НО это есть отклонение от изначальной системы, похоже на латание дыр для совместимости с предыдущими семействами.
Поправьте в чем не прав.
Сергей Борщ
Цитата(mdmitry @ Nov 6 2009, 17:46) *
Имеется прецедент в виде файла gpio_5xxx.h специально для этой серии. На мой взгляд и остальная периферия получается в этом же виде (отдельные файлы hardmodulname_54xxx.h).
Ну usi.h и usci.h ведь не смущают - разная периферия, разные файлы. Периферия семейства 5xxx настолько существенно отличается от предыдущих семейств, что мне показалось логичным вынести ее в отдельный файл. Может название не совсем уданое, но ничего лучше в голову не пришло.
Цитата(mdmitry @ Nov 6 2009, 17:46) *
похоже на латание дыр для совместимости с предыдущими семействами.
Есть предложения как улучшить - пишите в список рассылки, там последний год оживление наблюдается.
mdmitry
Цитата(Сергей Борщ @ Nov 6 2009, 19:45) *
Ну usi.h и usci.h ведь не смущают - разная периферия, разные файлы. Периферия семейства 5xxx настолько существенно отличается от предыдущих семейств, что мне показалось логичным вынести ее в отдельный файл. Может название не совсем уданое, но ничего лучше в голову не пришло.Есть предложения как улучшить - пишите в список рассылки, там последний год оживление наблюдается.

Смущает то, что напрашивается usi_54xx.h и т.д.
ВСЁ для этого семейства специфично и плохо стыкуется с имеющейся структурой файлов. Получается, что проект с другого контроллера нельзя практически перевести на это семейство, сменив только тип контроллера в makefile (расширенная периферия для совместимости предположительно не используется). Потребуется имена включаемых файлов изменять. Если такую переносимость во внимание не принимать, то всё годится.
hardmodulename_54xx.h вполне понятное название.
Предложений по улучшению, к сожалению, нет, одни сомнения.
Сергей Борщ
Цитата(mdmitry @ Nov 6 2009, 19:25) *
Получается, что проект с другого контроллера нельзя практически перевести на это семейство, сменив только тип контроллера в makefile (расширенная периферия для совместимости предположительно не используется). Потребуется имена включаемых файлов изменять.
Ой!
В проект включается только io.h. Из него, в зависимости от ключа -mmcu, автоматически включается нужный msp430fxxx.h, а уже из него тоже автоматически все необходимые файлы периферии.
mdmitry
Цитата(Сергей Борщ @ Nov 6 2009, 21:03) *
В проект включается только io.h. Из него, в зависимости от ключа -mmcu, автоматически включается нужный msp430fxxx.h, а уже из него тоже автоматически все необходимые файлы периферии.

?????
io.h -> msp430x54xx.h ->iomacros.h ->sys/inttypes.h
msp430/wdt_a.h
msp430/sys.h
msp430/gpio_5xxx.h
msp430/mpy32.h
msp430/timera.h
msp430/unified_clock_system.h
msp430/usci.h

msp430/timerb.h не включен
Если оставаться в этой системе для заголовочных файлов, то в соответствующие файлы необходимо внести дополнения.
В примерах включен не только io.h.

В winavr точно приходилось подключать несколько файлов.
Сергей Борщ
Цитата(mdmitry @ Nov 6 2009, 23:25) *
msp430/timerb.h не включен

Если оставаться в этой системе для заголовочных файлов, то в соответствующие файлы необходимо внести дополнения.
Вот потому timerb.h и не включен, что дополнения в него еще не внесены. То есть явно видно - timerb.h надо править или как минимум проверить на совместимость.
Цитата(mdmitry @ Nov 6 2009, 23:25) *
В примерах включен не только io.h.

В winavr точно приходилось подключать несколько файлов.
Открыл наугад 10 примеров. Во всех включен только io.h. В WinAVR для подключения описания периферии достаточно подключить только io.h. В документации на avr-libc это единственный рекомендуемый способ подключения описания периферии.
mdmitry
Цитата(Сергей Борщ @ Nov 7 2009, 10:45) *
В WinAVR для подключения описания периферии достаточно подключить только io.h.

Именно описания периферии, но не ей же единой. Хочется использовать вс,что есть (таймеры, сторожевой и т.д.).
Если говороить только о доступе к периферии, то io.h и полностью согласен с Вами.
Сергей Борщ
Цитата(mdmitry @ Nov 7 2009, 16:08) *
Хочется использовать вс,что есть (таймеры, сторожевой и т.д.).
То есть функции более высокого уровня (вроде wdt_reset()), уже написанные кем-то? Ну так их тоже можно дополнить до поддержки 5xxx.
MrYuran
Таки попробовал...
Компилятор что-то компилит.
А вот потом начинаются чудеса:
CODE
C:\mspgcc4\bin\msp430-gcc ./Obj/main.o ./Obj/process_MB.o ./Obj/measure.o
./Obj/temperature.o ./Obj/utils.o ./Obj/TimerB.o ./Obj/flash.o ./Obj/gen.o ./Obj/AD7708.o
./Obj/mb.o ./Obj/mbcrc.o ./Obj/mbrtu.o ./Obj/portevent.o ./Obj/portserial.o ./Obj/porttimer.o
./Obj/mbfunccoils.o ./Obj/mbfuncdiag.o ./Obj/mbfuncdisc.o ./Obj/mbfuncholding.o ./Obj/mbfuncinput.o
./Obj/mbfuncother.o ./Obj/mbutils.o ./Obj/dco.o
-mmcu=msp430x149 -Wl,--section-start -Wl,.seg_a=0x1080 -Wl,--gc-sections
-Wl,-Map=9010U.map,--cref -LC:\mspgcc4"\bin\lib" -LC:\mspgcc4"\msp430\lib"
-LC:\mspgcc4"\msp430\include" -LC:\mspgcc4"\msp430\include\msp430" -Wl,-relax -lc -lm -o 9010U.elf
./Obj/mb.o: In function `abs':
mb.c:(.text.abs+0x0): multiple definition of `abs'
./Obj/TimerB.o:TimerB.c:(.text.abs+0x0): first defined here
c:\mspgcc4\bin\msp430-ld.exe: Disabling relaxation: it will not work with multiple definitions
./Obj/mb.o: In function `labs':
mb.c:(.text.labs+0x0): multiple definition of `labs'
./Obj/TimerB.o:TimerB.c:(.text.labs+0x0): first defined here
./Obj/mbrtu.o: In function `abs':
mbrtu.c:(.text.abs+0x0): multiple definition of `abs'
./Obj/TimerB.o:TimerB.c:(.text.abs+0x0): first defined here
./Obj/mbrtu.o: In function `labs':
mbrtu.c:(.text.labs+0x0): multiple definition of `labs'
./Obj/TimerB.o:TimerB.c:(.text.labs+0x0): first defined here
./Obj/mbfunccoils.o: In function `abs':
mbfunccoils.c:(.text.abs+0x0): multiple definition of `abs'
./Obj/TimerB.o:TimerB.c:(.text.abs+0x0): first defined here
./Obj/mbfunccoils.o: In function `labs':
mbfunccoils.c:(.text.labs+0x0): multiple definition of `labs'
./Obj/TimerB.o:TimerB.c:(.text.labs+0x0): first defined here
./Obj/mbfuncdisc.o: In function `abs':
mbfuncdisc.c:(.text.abs+0x0): multiple definition of `abs'
./Obj/TimerB.o:TimerB.c:(.text.abs+0x0): first defined here
./Obj/mbfuncdisc.o: In function `labs':
mbfuncdisc.c:(.text.labs+0x0): multiple definition of `labs'
./Obj
/TimerB.o:TimerB.c:(.text.labs+0x0): first defined here
./Obj/mbfuncholding.o: In function `abs':
mbfuncholding.c:(.text.abs+0x0): multiple definition of `abs'
./Obj/TimerB.o:TimerB.c:(.text.abs+0x0): first defined here
./Obj/mbfuncholding.o: In function `labs':
mbfuncholding.c:(.text.labs+0x0): multiple definition of `labs'
./Obj/TimerB.o:TimerB.c:(.text.labs+0x0): first defined here
./Obj/mbfuncinput.o: In function `abs':
mbfuncinput.c:(.text.abs+0x0): multiple definition of `abs'
./Obj/TimerB.o:TimerB.c:(.text.abs+0x0): first defined here
./Obj/mbfuncinput.o: In function `labs':
mbfuncinput.c:(.text.labs+0x0): multiple definition of `labs'
./Obj/TimerB.o:TimerB.c:(.text.labs+0x0): first defined here
./Obj/mbfuncother.o: In function `abs':
mbfuncother.c:(.text.abs+0x0): multiple definition of `abs'
./Obj/TimerB.o:TimerB.c:(.text.abs+0x0): first defined here
./Obj/mbfuncother.o: In function `labs':
mbfuncother.c:(.text.labs+0x0): multiple definition of `labs'
./Obj/TimerB.o:TimerB.c:(.text.labs+0x0): first defined here
./Obj/mbutils.o: In function `abs':
mbutils.c:(.text.abs+0x0): multiple definition of `abs'
./Obj/TimerB.o:TimerB.c:(.text.abs+0x0): first defined here
./Obj/mbutils.o: In function `labs':
mbutils.c:(.text.labs+0x0): multiple definition of `labs'
./Obj/TimerB.o:TimerB.c:(.text.labs+0x0): first defined here
collect2: ld returned 1 exit status
mingw32-make.exe: *** [9010U.elf] Error 1
Process terminated with status 2 (0 minutes, 21 seconds)

А вот листинг и мап:
Нажмите для просмотра прикрепленного файла
что за abs и labs - в упор не понимаю...
-fwhole-program вроде работает, но требует, чтобы компилятору скармливались все файла зараз, иначе потом линкер концов не находит.

Короче, с ходу не взлетел sad.gif
Со старым всё компилится нормально
MrYuran
Нашёл предварительно, где копать:
stdlib.h:

Код
extern __inline__ int abs(int __x) __ATTR_CONST__;
extern __inline__ int abs(int __x)
{
    return (__x < 0)  ?  -__x  :  __x;
}
        
extern __inline__ long labs(long __x) __ATTR_CONST__;
extern __inline__ long labs(long __x)
{
    return (__x < 0)  ?  -__x  :  __x;
}


Ну и каким местом он влезает во все модули, где есть stdlib.h ?
Посмотрел, в старой версии этот файл один-в-один

Таки победил smile.gif
Пришлось extern __inline__ заменить на static __inline__
Цитата
Build project 9010U - OK.
text data bss dec hex filename
20191 72 742 21005 520d 9010U.elf
msp430-gcc (MSPGCC4_r4-20100210) 4.4.3
Copyright © 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Ну ничего себе "Better optimization. The generated code is typically 7%-10% smaller than code generated by MSPGCC-3.2.3"
- 20k против 12 от предыдущей версии!
Сергей Борщ
Цитата(MrYuran @ May 21 2010, 15:48) *
Ну и каким местом он влезает во все модули, где есть stdlib.h ?
Посмотрел, в старой версии этот файл один-в-один
Сочетание extern и __inline__ выглядит, мягко говоря, странным. Возможно старый и новый компиляторы трактуют __inline__ по-разному или в новых заголовочниках где-нибудь стоит строка
Код
#define __inline__


Цитата(MrYuran @ May 21 2010, 16:06) *
20k против 12 от предыдущей версии!
Так там еще куча ключей должна была добавиться. Возможно с ними и получше будет. Пробуйте вот с этими поиграться:
Код
#CFLAGS += -fno-ivopts
CFLAGS += -fno-tree-scev-cprop
#CFLAGS += -fno-split-wide-types
CFLAGS += -fno-inline-small-functions
CFLAGS += -fno-inline-functions

#adjust --param inline-call-cost= to get minimal code size
CFLAGS += --param inline-call-cost=1
#CFLAGS += -fno-reorder-blocks
#CFLAGS += -fno-reorder-blocks-and-partition
#CFLAGS += -fno-reorder-functions
#CFLAGS += -fno-toplevel-reorder
CFLAGS += -fno-move-loop-invariants
#CFLAGS += -fno-unroll-loops
#CFLAGS += -fno-unroll-all-loops
#CFLAGS += --param max-unroll-times=0
Очень влияет --param inline-call-cost=, причем на разных исходниках оптимум дают разные значения.
MrYuran
Цитата(Сергей Борщ @ May 21 2010, 17:14) *
Сочетание extern и __inline__ выглядит, мягко говоря, странным.

Ну, не я ж это придумал!
За ключики спасибо, буду играться.
Предыдущий результат был с -O3.
-Os даёт 13к против 12.7к, опять не в пользу 4 версии sad.gif
Так и не понял, к какому месту DWARF2 прикручивать...
Но в целом прогресс (с прошлого года) заметен.
Даже установщик кой-какой приделали.
В файлах периферии виднеются F5xx, СС430 и G2xx

Да, и это надо ещё на железке прогнать.
Старый компилятор, хоть и не без глюков, но собирал рабочие бинарники. Этот - пока не знаю.
AHTOXA
Цитата(MrYuran @ May 21 2010, 19:06) *
Ну ничего себе "Better optimization. The generated code is typically 7%-10% smaller than code generated by MSPGCC-3.2.3"
- 20k против 12 от предыдущей версии!

Это общая тенденция - 4й GCC генерит больший код, чем 3й. Хотя 20 против 12 - это явный перебор.
MrYuran
Цитата
За ключики спасибо, буду играться.

Код
Build project 9010U - OK.
   text       data        bss        dec        hex    filename
  14413         72        742      15227       3b7b    9010U.elf

Уже лучше!
Это -O2
Код
   text       data        bss        dec        hex    filename
  13077         72        742      13891       3643    9010U.elf

-Os
Совсем тепло... biggrin.gif
demiurg_spb
Цитата(AHTOXA @ May 21 2010, 17:22) *
Это общая тенденция - 4й GCC генерит больший код, чем 3й. Хотя 20 против 12 - это явный перебор.
Неа. Всё же со всеми новыми способами оптимизации 4й GCC получается получше 3-его.
MrYuran
Цитата(demiurg_spb @ May 21 2010, 18:01) *
Неа. Всё же со всеми новыми способами оптимизации 4й GCC получается получше 3-его.

Прикрутил-таки сегодня "вхоле-програм" и "комбайн". -Os
Код
Build project 9010U - OK.
   text       data        bss        dec        hex    filename
   7518          4        772       8294       2066    9010U.elf
msp430-gcc (MSPGCC4_r4-20100210) 4.4.3
Copyright (C) 2010 Free Software Foundation, Inc.

08.gif

-O3 выдал internal compiler error

-O2:
Код
   text       data        bss        dec        hex    filename
   8876          4        772       9652       25b4    9010U.elf


-O1:
Код
   text       data        bss        dec        hex    filename
   8824          4        772       9600       2580    9010U.elf


Оптимизация выключена:
Код
   text       data        bss        dec        hex    filename
  12574         72       1118      13764       35c4    9010U.elf

Практически то же самое, что 3-я версия давала с -O3
Если это ещё на железке заработает, вывод однозначный. Брать!
По оптимизации вполне сравнимо с ИАРом.
demiurg_spb
Цитата(MrYuran @ May 24 2010, 13:37) *
По оптимизации вполне сравнимо с ИАРом.
Так и о чём:-)
При таком способе оптимизации очень важно грамотно использовать volatile - и там где раньше и без него могло проканать - теперь не проканает...
AHTOXA
Цитата(MrYuran @ May 24 2010, 15:37) *
По оптимизации вполне сравнимо с ИАРом.

Круто! Теперь будет занята четверть объёма флешаsmile.gif
Цитата(demiurg_spb @ May 24 2010, 16:40) *
При таком способе оптимизации очень важно грамотно использовать volatile - и там где раньше и без него могло проканать - теперь не проканает...

Кстати да, ждём повторного отчёта, после расстановки всех положенных volatile wink.gif
MrYuran
Цитата(AHTOXA @ May 24 2010, 17:50) *
Круто! Теперь будет занята четверть объёма флешаsmile.gif

Дело не в этом, просто всё должно быть красиво!
Ну и хочется знать хотя бы теоретический предел "сжатия".
К тому же, у меня задачи достаточно легковесные (измериловка, обработка, обмен с хостом), а вот к примеру, для автономного прибора с графическим экранчиком, кучей менюшек и даже встроенным блокнотом уже начинает играть рояль.
Причём, от оптимизации и потребление может зависеть (хотя, на фоне экранчика, жрущего как лошадь 3мА, это всё копейки...)
Или вот например, выпустили серию G2xx. Вот если бы добавили флеша хотя бы до 8кБ, то туда можно было бы упихать что-нибудь стоящее.

Попробовал вчера ещё один проект собрать, там что-то непонятное творит.
Такое ощущение, что вместо elf-а подсовывает неразлинкованный объектник.
Нажмите для просмотра прикрепленного файла
demiurg_spb
Цитата(MrYuran @ May 25 2010, 09:43) *
Такое ощущение, что вместо elf-а подсовывает неразлинкованный объектник.
Да ну... Откуда такие предположения? Вроде как при такой компиляции он объектные файлы вообще не создаёт.
У Вас в Makefile конечная цель elf или всё-таки ещё получаете hex или bin и что с ними?
MrYuran
Цитата(demiurg_spb @ May 25 2010, 13:24) *
Да ну... Откуда такие предположения? Вроде как при такой компиляции он объектные файлы вообще не создаёт.
У Вас в Makefile конечная цель elf или всё-таки ещё получаете hex или bin и что с ними?

Предположения из листинга, полученного обждампом из эльфа.
Делаю так:
Код
$(NAME).elf : $(CSRC)
    @echo $^
    @$(CC) -c $(CFLAGS) -combine -fwhole-program $^ $(LDFLAGS) -o $@

Как уже писал, в предыдущем проекте всё собралось нормально.
И листинг нормальный.
CODE

Disassembly of section .text:

00001100 <__init_stack>:

1100: 31 40 00 0a mov #2560, r1 ;#0x0a00

00001104 <__low_level_init>:

1104: b2 40 80 5a mov #23168, &0x0120 ;#0x5a80
1108: 20 01

0000110a <__do_clear_bss>:
110a: 3f 40 e6 02 mov #742, r15 ;#0x02e6
110e: 0f 93 tst r15
1110: 04 24 jz $+10 ;abs 0x111a
1112: 1f 83 dec r15
1114: cf 43 48 02 mov.b #0, 584(r15);r3 As==00, 0x0248(r15)
1118: fc 23 jnz $-6 ;abs 0x1112

0000111a <__do_copy_data>:
111a: 3f 40 48 00 mov #72, r15 ;#0x0048
111e: 0f 93 tst r15
1120: 05 24 jz $+12 ;abs 0x112c
1122: 2f 83 decd r15
1124: 9f 4f 68 5a mov 23144(r15),512(r15);0x5a68(r15), 0x0200(r15)
1128: 00 02
112a: fb 23 jnz $-8 ;abs 0x1122

0000112c <__jump_to_main>:
112c: 30 40 54 22 br #0x2254

00001130 <__ctors_end>:
1130: 30 40 3e 12 br #0x123e


а вот "ненормальный":
CODE
Disassembly of section .text.GetRealTime.1824:

00000000 <GetRealTime.1824>:
0: 0b 12 push r11
2: 0b 4f mov r15, r11
4: 08 3c jmp $+18 ;abs 0x16
6: 1e 42 00 00 mov &0x0000,r14
a: 1f 42 00 00 mov &0x0000,r15
e: 8b 4e 00 00 mov r14, 0(r11) ;0x0000(r11)
12: 8b 4f 02 00 mov r15, 2(r11) ;0x0002(r11)
16: 1c 42 00 00 mov &0x0000,r12
1a: 1d 42 00 00 mov &0x0000,r13
1e: 3e 4b mov @r11+, r14
20: 3f 4b mov @r11+, r15
22: 2b 82 sub #4, r11 ;r2 As==10
24: 0c 9e cmp r14, r12
26: ef 23 jnz $-32 ;abs 0x6
28: 0d 9f cmp r15, r13
2a: ed 23 jnz $-36 ;abs 0x6
2c: 3b 41 pop r11
2e: 30 41 ret
Disassembly of section .text.Beep.1817:

00000000 <Beep.1817>:
0: 0b 12 push r11
2: 0a 12 push r10
4: 0b 4f mov r15, r11
6: 3f 40 00 00 mov #0, r15 ;#0x0000
a: b0 12 00 00 call #0x0000
e: 0c 4b mov r11, r12
10: 3a 40 05 00 mov #5, r10 ;#0x0005
14: b0 12 00 00 call #0x0000
18: 0d 43 clr r13
1a: 82 5c 00 00 add r12, &0x0000
1e: 82 6d 00 00 addc r13, &0x0000
22: e2 c3 31 00 bic.b #2, &0x0031 ;r3 As==10
26: 3a 41 pop r10
28: 3b 41 pop r11
2a: 30 41 ret


Если первый выглядит как нормальный бинарник, с конкретными абсолютными адресами, то второй - как нелинкованный выход компилятора.
demiurg_spb
Давайте посмотрим на всю стоку целиком.
Вот как у меня:
Цитата
avr-gcc -mmcu=atmega162 -MMD -MP -MF ../bin/Veha_CSH162/Veha_C_DAC_RS.dep -gdwarf-2 -DF_CPU=14745600UL -Os -pedantic -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -fno-split-wide-types --combine -fwhole-program -ffunction-sections -fdata-sections -Wl,--relax -ftree-loop-ivcanon -mcall-prologues -fno-tree-scev-cprop -finline-small-functions -fearly-inlining --param inline-call-cost=2 -finline-limit=100 -fno-unit-at-a-time -Wsign-compare -Wa,-adhlns=../bin/Veha_CSH162/Veha_C_DAC_RS.lst -std=c99 -DINTERFACE_DAC_ON -DINTERFACE_RS_ON -DBOOTLOADER_START_ADDRESS=0x3800 -DBOOTLOADER_SIZE=2048 -DLOW_LEVELX_H=low_level3.h -DDEVICE_DESCRIPTOR=0x08030003 -DPROJECT_NAME=Veha_C -DPROJECT_MAJOR_REV=1 -DPROJECT_MINOR_REV=35 -I. -I./conf -I./hal -I./ui -I./io -I./../../../arclib/avr -I./../../../arclib/ic_drivers -I./../../../arclib/common -I./../../../arclib/common/modbus ./../../../arclib/common/bin_bcd.c ./../../../arclib/avr/eeprom_sfloat.c ./../../../arclib/avr/led_keyboard.c ./../../../arclib/avr/led7.c ./ui/led_interface.c ./../../../arclib/common/keys.c ./io/di.c ./io/do.c ./hal/power_good.c ./io/counter.c ./io/cnt_logic.c ./ui/callbacks.c ./ui/edit.c ./ui/prog.c ./hal/timer.c ./../../../arclib/avr/crc16.c ./../../../arclib/avr/rs485.c ./../../../arclib/common/modbus/modbus_buffer.c ./../../../arclib/common/modbus/modbus_timer.c ./../../../arclib/common/modbus/modbus_slave_func.c ./../../../arclib/common/modbus/modbus_slave.c ./io/dac.c ./hal/init_dev.c main.c --output ../bin/Veha_CSH162/Veha_C_DAC_RS.elf -Wl,-Map=../bin/Veha_CSH162/Veha_C_DAC_RS.map,--cref -Wl,--gc-section -lm
MrYuran
А как заставить make выводить весь поток полностью?
У меня выводит только результаты
AHTOXA
make -n ?
MrYuran
Цитата
d:\WORK\PROJECTS\MARK-1002T\BAD-1002T\PROGRAM\1002D_05_00>mingw32-make -n all
echo main/demo.c measure/measure.c utils/utils.c timerb/TimerB.c flash/flash.c d
oser/doser.c ds2433/ds2433.c keyboard/keyboard.c heater/heater.c UART/uart.c sys
tem/dco.c indicator/indicator.c
C:\mspgcc4\bin\msp430-gcc -c -mmcu=msp430x149 -O3 -DGCC_MSP430 -Wall -Wshadow -W
pointer-arith -Wbad-function-cast -Wcast-align -Wsign-compare -Waggregate-return
-Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wunused -std=g
nu99 -fdata-sections -ffunction-sections -I./ -I./main -I./measure -I./utils -I.
/timerb -I./flash -I./doser -I./ds2433 -I./keyboard -I./heater -I./UART -I./syst
em -I./indicator -Wa,-adhlns=./Lst/demo.lst -combine -fwhole-program main/demo.c
measure/measure.c utils/utils.c timerb/TimerB.c flash/flash.c doser/doser.c ds2
433/ds2433.c keyboard/keyboard.c heater/heater.c UART/uart.c system/dco.c indica
tor/indicator.c -mmcu=msp430x149 -Wl,--section-start -Wl,.seg_a=0x1080 -Wl,--gc-
sections -Wl,-Map=1002TD.map,--cref -LC:\mspgcc4"\bin\lib" -LC:\mspgcc4"\msp430\
lib" -LC:\mspgcc4"\msp430\include" -LC:\mspgcc4"\msp430\include\msp430" -Wl,-rel
ax -lc -lm -o 1002TD.elf
echo Build project 1002TD - OK.
C:\mspgcc4\bin\msp430-size -B 1002TD.elf
C:\mspgcc4\bin\msp430-gcc --version
demiurg_spb
Цитата(MrYuran @ May 25 2010, 14:23) *
А как заставить make выводить весь поток полностью?
У меня выводит только результаты

Цитата(AHTOXA @ May 25 2010, 14:28) *
make -n ?

Или возможно убрать собаку из начала этой строчки.
Цитата(MrYuran @ May 25 2010, 13:40) *
Код
    @$(CC) -c $(CFLAGS) -combine -fwhole-program $^ $(LDFLAGS) -o $@


А так ничего страшного не вижу. Странно...

Единственное, проще включить опцию -pedantic и стандарт С99 вместо gnu99,
тогда не нужно будет столько много ключей про варнинги (-Wmissing-prototypes -Wmissing-declarations...)

Ещё посмотрите на это:
-Wl,--relax
-ftree-loop-ivcanon
-mcall-prologues
-fno-tree-scev-cprop
-finline-small-functions
-fearly-inlining
--param inline-call-cost=2
-finline-limit=100
-fno-unit-at-a-time

И вообще с оптимизацией -Os всегда получаются самые лучшие результаты (разницы по скорости с -O3 реально фактически нет).
MrYuran
Короче, я понял.
Он все секции мапит на 0x0000, в результате итоговый размер определяется самой длинной секцией.
Глюк в чистом виде.
фтопку...

Хотя нет... Достаём обратно...
Код
$(NAME).elf : $(CSRC)
    @echo $^
    @$(CC) -c $(CFLAGS) $^ $(LDFLAGS) -o $(NAME).o
    $(CC) $(NAME).o $(LDFLAGS) -o $@
    $(OBJCOPY) -O ihex $(NAME).elf $(NAME).a43

Как я и думал, это был объектник, который надо ещё слинковать laughing.gif
За один проход никак...

Код
   text       data        bss        dec        hex    filename
  23004          2        257      23263       5adf    1002TD.elf

Вот это похоже на правду.

А вот это без -combine и -fwhole-program:
Код
   text       data        bss        dec        hex    filename
  26954          2        302      27258       6a7a    1002TD.elf

Разница, конечно, есть, но не такая сказочная.
На -Os - вообще 22кБ против 23
MrYuran
Противоречивые какие-то чувства навевает...
Поигрался сегодня вдоволь.
Обнаружил странный глюк: (а может, так и должно быть?)
если объявить interrupt функцию как static inline, то она не линкуется, а вместо неё в таблицу векторов забивается _unexpected_
Причём, даже отдельно static или inline тоже вызывают подобный глюк.
В старой версии некоторые комбинации проходят.
Кстати, ключ "вхоле_програм" вызывает подобный глюк при любом раскладе.

Размер таки 4 версия компилит бОльший, чем предыдущая. С 20кБ около 2-х набегает, а вот с 50 - уже все 5, и можно случайно не влезть во флешь со старым проектом...

В поисках флагов для "полновесного" sprintf() наткнулся на вот что:
http://mspgcc.bzr.sf.net/bzr/mspgcc/mspgcc-core/changes
Оказывается, исходный mspgcc жив!
Осталось таки научиться его собирать...
demiurg_spb
Цитата(MrYuran @ Jun 11 2010, 17:29) *
если объявить interrupt функцию как static inline
Этого делать не надо т.к. при архитектуре mcu с таблицей векторов прерываний невозможно в принципе инлайнить обработчики прерываний.

Цитата(MrYuran @ Jun 11 2010, 17:29) *
Причём, даже отдельно static или inline тоже вызывают подобный глюк.
со static - это действительно бага.

Цитата
Кстати, ключ "вхоле_програм" вызывает подобный глюк при любом раскладе.
Не бейте пианиста он играет как умеетsmile.gif
MrYuran
ААААААААААААААААААААААААААААААА!!!!!!
smile3046.gif
twak.gif
maniac.gif
Нашел причину всех моих неудач за последний месяц!
Идея была в том, чтобы написать культурный HAL на основе mspgcc-шного iostructures.h
И что я сегодня заметил?!
Код
static  void ClearWatchDog(void)
{
    SYS_WDT.out.SYS_WDT_PIN = 1;
    5300:    b2 d0 80 00     bis    #128,    &0x001e;#0x0080
    5304:    1e 00
/main/../platform/watchdog_lo_level.h:27
    SYS_WDT.out.SYS_WDT_PIN = 0;
    5306:    b2 f0 7f ff     and    #-129,    &0x001e;#0xff7f
    530a:    1e 00

SYS_WDT - это port4:
#if defined(__MSP430_HAS_PORT4__) || defined(__MSP430_HAS_PORT4_R__)
__MSP430_EXTERN__ struct port_simple_t port4 asm("0x001c");
#endif
, где
Код
struct port_simple_t {
  ioregister_t    in;     /* Input */ ->1c
  ioregister_t    out;    /* Output */ ->1d
[b] ioregister_t    dir;    /* Direction */ ->1e[/b]
  ioregister_t    sel;    /* Selection */
};

Ну и каких, собственно, аллюзий out стал по адресу 1e?
То есть всё как бы съехало на 1 адрес, и я вместо того чтобы махнуть ногой, переключаю направление...
После такого стресса перестаёшь верить в разумное и доброе, хочется выдернуть шнур и выдавить стекло.
И в отпуск на полгода...

Ну а это уже ни в какие рамки:
Код
static  void WatchDogInit(void)
{
    SYS_WDT.out.SYS_WDT_PIN = 0;
    44e8:    3f 40 1e 00     mov    #30,    r15;#0x001e
    44ec:    bf f0 7f ff     and    #-129,    0(r15);#0xff7f, 0x0000(r15)
    44f0:    00 00
/main/../platform/watchdog_lo_level.h:16
    SYS_WDT.sel.SYS_WDT_PIN = 0;
    44f2:    bf f0 7f ff     and    #-129,    4(r15);#0xff7f, 0x0004(r15)
    44f6:    04 00
/main/../platform/watchdog_lo_level.h:17
    SYS_WDT.dir.SYS_WDT_PIN = 1;
    44f8:    bf d0 80 00     bis    #128,    2(r15);#0x0080, 0x0002(r15)
    44fc:    02 00

Поля структуры просто перетасованы в каком-то непонятном порядке... и всё сдвинуто

Но ведь работало же как-то раньше!

Кажись допёр... Структуры должны быть packed sad.gif
Может есть такой ключик, чтобы все структуры упаковать?
А то по одной долго возиться, да и править системные исходники не совсем идеологически правильно

######
__attribute__ ((packed)) не помог...
все регистры по 2 байта.
Со старым компилятором то же самое.
Что за жизнь пошла...
MrYuran
Вот кстати интересно:
Кто структуры пакует - компилятор или линкер?
В смысле - кто виноват?
И что делать?

Так и придётся, видимо, как встарь - макросы, битовые масочки... Тупо, зато работает
demiurg_spb
Про упаковку всех структур:
Код
CFLAGS += -fpack-struct

Про перетасовку, возможно, что-то из этого (некогда сейчас вникать):
Код
CFLAGS += -fno-reorder-blocks
CFLAGS += -fno-reorder-blocks-and-partition
CFLAGS += -fno-reorder-functions
CFLAGS += -fno-toplevel-reorder

Цитата(MrYuran @ Jun 17 2010, 12:45) *
Вот кстати интересно:
Кто структуры пакует - компилятор или линкер?
Думается, что компилятор.
Линкер лишь связывает.
MrYuran
Цитата(demiurg_spb @ Jun 17 2010, 13:25) *
CFLAGS += -fpack-struct
CFLAGS += -fno-reorder-blocks
CFLAGS += -fno-reorder-blocks-and-partition

Ура, заработало!
Вотжеж, засады поджидают на каждом шагу на пути к культуре...
А я уж было на плюсы намылился, чтобы, как АНТОХА, писать WatchDog->Clear(); biggrin.gif
Код
    Myport4.in.pin4 = 1;
    5178:    f2 d0 10 00     bis.b    #16,    &0x001c;#0x0010
    517c:    1c 00
D:\ex_work\work\Программы\1003D_430_01_00\NEW_DOSER/main/../platform/watchdog_lo_level.h:31
    Myport4.out.pin4 = 1;
    517e:    f2 d0 10 00     bis.b    #16,    &0x001d;#0x0010
    5182:    1d 00
D:\ex_work\work\Программы\1003D_430_01_00\NEW_DOSER/main/../platform/watchdog_lo_level.h:32
    Myport4.dir.pin4 = 1;
    5184:    f2 d0 10 00     bis.b    #16,    &0x001e;#0x0010
    5188:    1e 00
D:\ex_work\work\Программы\1003D_430_01_00\NEW_DOSER/main/../platform/watchdog_lo_level.h:33
    Myport4.sel.pin4 = 1;
    518a:    f2 d0 10 00     bis.b    #16,    &0x001f;#0x0010
    518e:    1f 00
Сергей Борщ
Цитата(MrYuran @ Jun 17 2010, 12:31) *
Ура, заработало!
При этом все структуры стали упакованными. С вытекающими тормозами там, где не нужно. Давным-давно была бага с невыровненным доступом, я ее исправлял. В mspgcc3. Не было никаких проблем с доступом к портам. Скорее собака зарыта в описании структур. Как объявлен ioregister_t? Судя по пословному доступу в первом примере - он объявлен как двухбайтовый. И, соответственно, выровнен. С упаковкой при помощи __attribute__((packed)) тоже никаких проблем. У меня сейчас mspgcc не стоит, но если есть желание разобраться - могу поставить.
MrYuran
Цитата(Сергей Борщ @ Jun 17 2010, 16:34) *
С упаковкой при помощи __attribute__((packed)) тоже никаких проблем.

Вот и у меня не было, как говорится, пришла беда, откуда не ждали.
Причём пробовал и старую версию (в мэйкфайле меняю MSPGCC_ROOT c С:\mspgcc4 на C:\mspgcc) - то же самое.
Причём раньше-то точно работало. В нескольких проектах.
После этого, правда, пару раз систему переставляли, может чего упустили...
А сегодня, в разгар разборок, вообще винчестер сдох. Не выдержал...

Видимо, таки придётся учиться собирать из исходников.
на bzr, я так понял, готовых сборок не выкладывают
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.