Перейти к содержанию
    

Вопросы по Eclipse, CDT, Zylin embedded CDT

Неужели выходит что альтернативы указателям нет?
Есть на уровне идеи. Описать в программе как extern структуры, соответствующие периферии, а адреса им назначить в скрипте или командной строке линкера. Попробуйте, отпишитесь. Я не вижу, почему не должно работать. Примерно такое:
ioAT91SAM7S64.h:
.....

extern AT91S_PIO PIOA;


LDFLAGS += -DPIOA=0xFFFFF400

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть на уровне идеи. Описать в программе как extern структуры, соответствующие периферии, а адреса им назначить в скрипте или командной строке линкера. Попробуйте, отпишитесь. Я не вижу, почему не должно работать.

 

Не стреляет...

И в заголовнике написал "extern AT91S_PIO PIOA;"

В командной строке "LDFLAGS += -DPIOA=0xFFFFF400" выдает ошибку (Yagarto).

Поэтому попробовал два варианта:

1. "LDFLAGS += -defsym PIOA=0xFFFFF400"

2. В скрипте линкера я указал следующее "PIOA = 0xFFFFF400;"

 

Ни первый ни второй вариант не работают.

При отладке в закладке "Expressions" символ DPIOA имеет значение "0"

Или я может где то ошибся?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не стреляет...

ИМХО тогда надо в скрипте линкера прописать эти адреса. Тогда гарантированно будет работать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы скрипты дебаггера посмотрите.

Может они портят все настройки периферии контроллера при отладке.

В этом случае не в плагине дело.

 

В том то и дело, что скрипт один и тот же в разных проектах, и в нём нет инициализации регистров кроме маппинга...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ИМХО тогда надо в скрипте линкера прописать эти адреса. Тогда гарантированно будет работать.

 

в скрипте я указывал адрес: "PIOA = 0xFFFFF400;"

для символа в исходниках: "extern AT91S_PIO PIOA"

 

или это делается по другому?

примерчик можете накидать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В командной строке "LDFLAGS += -DPIOA=0xFFFFF400" выдает ошибку (Yagarto).
Да, тут я ошибся. Имел ввиду LDFLAGS+= -Wl,--defsym,PIOA=0xFFFFF400

Проверить прямо сейчас не могу.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, тут я ошибся. Имел ввиду LDFLAGS+= -Wl,--defsym,PIOA=0xFFFFF400

Проверить прямо сейчас не могу.

 

-Wl - это что за опция?

На ней выдается ошибка...

 

Ребята!!!

У кого получилось - дайте знать...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

-Wl - это что за опция?
Это указание gcc передать следующую за ней опцию линкеру.

На ней выдается ошибка...
"ВСЕ НЕ РАБОТАЕТ!" :lol: Вы бы хоть текст ошибки приводили. Не все тут в состоянии угадать его телепатически. Если ошибка типа "неизвестная опция" - значит у вас в makefile линкер ld вызывается явно, а не посредством драйвера gcc.

У кого получилось - дайте знать...
Будет время - попробую. Сейчас, увы, куча работы. Пробуйте самостоятельно. Уж описание опции -Wl можно было нагуглить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это указание gcc передать следующую за ней опцию линкеру.

Если ошибка типа "неизвестная опция" - значит у вас в makefile линкер ld вызывается явно, а не посредством драйвера gcc

Уж описание опции -Wl можно было нагуглить.

Спасибо понял.

Я действительно в make прописал линковку через ld и соответственно опцию -Wl искал в документации по линкеру LD.

 

Описание символа следующее:

extern AT91S_PIO PIOA;

 

Командная строка ликера выглядит так:

arm-none-eabi-ld -Map Output.map -TOutput_RAM.ld -defsym PIOA=0xFFFFF400 -o Output.out Startup.o AppMain.o

 

Тем не менее символ PIOA при отладке имеет нулевое значение.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

или это делается по другому?

примерчик можете накидать?

Да, по другому:

в скрипте линкера (тот файл, что вы указываете в опциях линкера после ключа "-T") добавляете секцию:

/* Memory Definitions */                                                                        
MEMORY                                                                                          
{                                                                                               
  FLASH  (rx) : ORIGIN = 0x00000000, LENGTH = 0x00080000                                        
  RAM    (rw) : ORIGIN = 0x40000000, LENGTH = 0x00010000                                        
  USBRAM (rw) : ORIGIN = 0x7FD00000, LENGTH = 0x00004000                                        
  ETHRAM (rw) : ORIGIN = 0x7FE00000, LENGTH = 0x00004000                                        
  RTCRAM (rw) : ORIGIN = 0xE0084000, LENGTH = 0x00000800                                        
  /* Добавим ниже область памяти с периферией. В моём случае в качестве периферии будет контроллер VIC */
  VIC    (rw) : ORIGIN = 0xFFFFF000, LENGTH = 0x00000FFF                                        

}

....
....
....

/* Section Definitions */                                                                       
                                                                                                
SECTIONS                                                                                        
{                                                                                               
  /* В описании секций добавим секцию где будут размещаться регистры периферии VIC */
  vic (NOLOAD):                                                                                 
  {                                                                                             
    *(vic)                                                                                      
  } > VIC                                                                                       
  /* Указываем что секция размещается в области памяти, принадлежащей VIC */

....
....
....

 

Далее в коде программы описывем регистры:

 

....
#include <stdint.h>
....
/* Описываем регистры, и указываем что они размещены в секции "vic" */
volatile uint32_t __attribute__((section("vic"))) REG_VICIRQStatus;                             
volatile uint32_t __attribute__((section("vic"))) REG_VICFIQStatus;                             
volatile uint32_t __attribute__((section("vic"))) REG_VICRawIntr;                               
volatile uint32_t __attribute__((section("vic"))) REG_VICIntSelect;                             
volatile uint32_t __attribute__((section("vic"))) REG_VICIntEnable;                             
volatile uint32_t __attribute__((section("vic"))) REG_VICIntEnClr;                              
volatile uint32_t __attribute__((section("vic"))) REG_VICSoftInt;                               
volatile uint32_t __attribute__((section("vic"))) REG_VICSoftIntClr;                            
volatile uint32_t __attribute__((section("vic"))) REG_VICProtection;                            
volatile uint32_t __attribute__((section("vic"))) REG_VICSWPrioMask;                            
...

 

Пересобираем программу и наслаждаемся отладкой периферии =)

Проверил код и отладку. Работает.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

.....

volatile uint32_t __attribute__((section("vic"))) REG_VICSWPrioMask;

...

Пересобираем программу и наслаждаемся отладкой периферии =)

Проверил код и отладку. Работает.

 

так так так...... этож я могу туда и структуры и битовые поля засунуть! и тогда отладчик будет парсить и значение битов! поробую прокрутить фарш через мясорубку.... отпишусь

идея новая но косяков пока не вижу...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

так так так...... этож я могу туда и структуры и битовые поля засунуть! и тогда отладчик будет парсить и значение битов! поробую прокрутить фарш через мясорубку.... отпишусь

идея новая но косяков пока не вижу...

Обязательно отпишитесь о результатах.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Обязательно отпишитесь о результатах.

 

получилось но криво. в линкер ничего пихать не надо.

я залез в объявление структуры DAC_TypeDef (stm32f10x.h)

 

если компилировать с помощью c++ то проблен нет вообще

 

заменяем объявление поля структуры на (пример для регистра СR ЦАПа)

typedef struct
{
  __IO uint32_t CR;
  __IO uint32_t SWTRIGR;
  __IO uint32_t DHR12R1;
  .....
} DAC_TypeDef;

на

typedef struct
{
    union CR {
      __IO uint32_t val;
        struct
                  {
                    uint32_t EN1 : 1;
                    uint32_t BOFF1 : 1;
                    uint32_t TEN1 : 1;
                    uint32_t TSEL1 : 3;
                    uint32_t WAWE1 : 2;
                    uint32_t MAMP1 : 4;
                    uint32_t DMAEN1 : 1;
                    uint32_t Reserve1 : 3;

                    uint32_t EN2 : 1;
                    uint32_t BOFF2 : 1;
                    uint32_t TEN2 : 1;
                    uint32_t TSEL2 : 3;
                    uint32_t WAWE2 : 2;
                    uint32_t MAMP2 : 4;
                    uint32_t DMAEN2 : 1;
                    uint32_t Reserve2 : 3;
                  } CR_BITS;
                CR& operator= (const uint32_t src) { val = src; return *this; }
        };
  __IO uint32_t SWTRIGR;
  __IO uint32_t DHR12R1;
  .....
} DAC_TypeDef;

 

итогом становится то что двойное слово теперь интерпретируется как битовое поле объедененное с этим словом. отладчик бодро отрисовывает содержание полей.

в этом способе есть ложка дегтя - посколькоу __IO uint32_t CR превратился в enum {...} то в коде использующем DAC_TypeDef операция DAC->CR=XXX будет неактуальна, потому что нельзя присвоить целого типа в объект объединения типа, поэтому приходится перегрузит операцию присваивания с помощью CR& operator= (const uint32_t src). Это сразуже ствит крест на возможности скомпилировать с помощю компилятора С.

 

теперь вариант с компиллером С. в принципе можно объявить структуру анонимной без перегрузки присваивания но уже с полем __IO uint32_t CR :

typedef struct
{
        union {
      __IO uint32_t CR;
        struct
                  {
                    uint32_t EN1 : 1;
                    uint32_t BOFF1 : 1;
                    uint32_t TEN1 : 1;
                    uint32_t TSEL1 : 3;
                    uint32_t WAWE1 : 2;
                    uint32_t MAMP1 : 4;
                    uint32_t DMAEN1 : 1;
                    uint32_t Reserve1 : 3;

                    uint32_t EN2 : 1;
                    uint32_t BOFF2 : 1;
                    uint32_t TEN2 : 1;
                    uint32_t TSEL2 : 3;
                    uint32_t WAWE2 : 2;
                    uint32_t MAMP2 : 4;
                    uint32_t DMAEN2 : 1;
                    uint32_t Reserve2 : 3;
                  } CR_BITS;
        };
  __IO uint32_t SWTRIGR;
  __IO uint32_t DHR12R1;
  .....
} DAC_TypeDef;

 

в этом случае DAC->CR=XXX проходит естественно на ура но..... отладчик теперь не знает имени объединения , потому что его нет - оно анонимное. приплыли.

 

если на то что нада периписать все обращения вызовы DAC->CR=XXX на DAC->CR.val = XXX закрыть глаза ( например библиотечные где уже с этим регистром чтото делается ) то проблем вообще нет - в данном случае называем объединение конкретным именем CR и все работает.

разумется в скрипт линкера ничего сувать не требуется, он вообще тут непричем, адрес региста из дефайна берется а не из адреса секции.

 

никакх

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

подскажите, как работать с репозиторием Google Code?

я сделал следующее:

1. создал проект на code.google.com

2. скачал и установил Subclipse плагин к Eclipse

теперь пробую сделать для своего проекта Team - Share Project: в появляющемся оконце ввожу то, что написано в закладке Source в интерфейсе code.google.com (это примерно такое: https://my-project.googlecode.com/svn/trunk/ my_project --username my_name@my_post.com) - получаю в итоге ошибку "Затребованное имя допустимо и оно найдено в базе данных, но для имени отсутствуют связанные с ним даные"... что это значит? когда и где вводится пароль на запись в репозиторий? как вообще правильно подключаться к SVN-репозиторию?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...