Jump to content

    
Сергей Борщ

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

Recommended Posts

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

extern AT91S_PIO PIOA;


LDFLAGS += -DPIOA=0xFFFFF400

 

Share this post


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

 

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

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

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

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

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

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

 

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

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

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

Share this post


Link to post
Share on other sites
Вы скрипты дебаггера посмотрите.

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

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

 

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

Share this post


Link to post
Share on other sites
ИМХО тогда надо в скрипте линкера прописать эти адреса. Тогда гарантированно будет работать.

 

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

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

 

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

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

Share this post


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

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

 

 

Share this post


Link to post
Share on other sites
Да, тут я ошибся. Имел ввиду LDFLAGS+= -Wl,--defsym,PIOA=0xFFFFF400

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

 

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

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

 

Ребята!!!

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

Share this post


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

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

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

Share this post


Link to post
Share on other sites
Это указание 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 при отладке имеет нулевое значение.

Share this post


Link to post
Share on other sites
или это делается по другому?

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

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

в скрипте линкера (тот файл, что вы указываете в опциях линкера после ключа "-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;                            
...

 

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

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

 

Share this post


Link to post
Share on other sites
.....

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

...

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

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

 

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

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

 

Share this post


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

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

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

Share this post


Link to post
Share on other sites
Обязательно отпишитесь о результатах.

 

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

я залез в объявление структуры 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 и все работает.

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

 

никакх

Share this post


Link to post
Share on other sites

подскажите, как работать с репозиторием 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-репозиторию?

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.