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

Xilinx SDK 12.1 не работают программы

Добрый день.. возникла такая проблема:

1. Написал простенький код на "С" в EDK

 

#include "xparameters.h"
#include "xutil.h"

int main (void) {

    int ver = 0;
    int i = 0;
    unsigned int *BASEADDR_SW = XPAR_SW_REG_CONTROL_BASEADDR;
    unsigned int *BASEADDR_REG_CONTROL = XPAR_PLB46_RO_RW_REG_0_BASEADDR;
    
    for (i = 0; i<65535; i++) {
        ver = *(BASEADDR_SW);
        *(BASEADDR_REG_CONTROL) = ver;
    }
   return 0;
}

НЕ работает... нет транзакций на шине plb вообще не зависимо от способа оптимизации кода.. (выбирал между О0 и О2)

 

пробовал for заменять на while (1)

тоже не работает... но есть 1 транзакция на чтение BASEADDR_SW и бесконечное множество записи по адресу BASEADDR_REG_CONTROL

первого считанного значения. т.е. пишется все время только то что в первый раз было вычитано, хотя данные BASEADDR_SW меняются.

Причем такое поведение при оптимизации кода О2, без оптимизации нет транзакций вообще, как в первом случае.

 

Написал по другому, без while и с другим регистром (REG_VERSION), в нем просто зашита константа.. он не меняется

#include "xparameters.h"
#include "xutil.h"

int main (void) {

    int ver = 0;
    int i = 0;
    unsigned int *BASEADDR_VER = XPAR_PLB46_REG_VERSION_0_BASEADDR;
    unsigned int *BASEADDR_REG_CONTROL = XPAR_PLB46_RO_RW_REG_0_BASEADDR;
    
    ver = *(BASEADDR_VER);
    *(BASEADDR_REG_CONTROL) = ver;
   return 0;
}

работает, данные из BASEADDR_VER прочитались и нормально записались в BASEADDR_REG_CONTROL. Но работает только при отключенной оптимизации.

 

Но самое интересное, что я попробовал повторить те же варианты программ в SDK, не работает ни одна.. не зависимо от выбранной оптимизации.

 

ВОПРОС: что это, глюк компилятора или какие-то новые особенности 12.1?

Подобные операции в 10.1 выполнялись без каких либо проблем, если оптимизация отключена была.

Изменено пользователем mSimple

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


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

Попробуйте использовать volatile:

    volatile int ver = 0;
    int i = 0;
    volatile unsigned int *BASEADDR_VER = XPAR_PLB46_REG_VERSION_0_BASEADDR;
    volatile unsigned int *BASEADDR_REG_CONTROL = XPAR_PLB46_RO_RW_REG_0_BASEADDR;

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


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

Попробуйте использовать volatile:

    volatile int ver = 0;
    int i = 0;
    volatile unsigned int *BASEADDR_VER = XPAR_PLB46_REG_VERSION_0_BASEADDR;
    volatile unsigned int *BASEADDR_REG_CONTROL = XPAR_PLB46_RO_RW_REG_0_BASEADDR;

Спасибо.. помогло :)

Но все равно странно, почему в 10.1 с PowerPC мне этого не требовалось, а в 12.1 c Microblaze потребовалось..

Я почему-то считал, что с точки зрения программиста они одинаковы.. ну, или это особенности новой среды 12.1

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


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

Спасибо.. помогло :)

Но все равно странно, почему в 10.1 с PowerPC мне этого не требовалось, а в 12.1 c Microblaze потребовалось..

Я почему-то считал, что с точки зрения программиста они одинаковы.. ну, или это особенности новой среды 12.1

Всё законно. volatile это из стандарта на язык "с" именно для таких случаев. А вот компиляторы только следуют данному стандарту. И соответственно это просто криво написанная программа. А не особенности кого либо.

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


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

Все, разобрался!... проблема была вовсе не в volatile и не коде программы, все дело в том, что читал я выход GPIO! В новой версии 12.1 GPIO устроен несколько по другому, чем в 10.1. Хотя GPIO у меня использовался как Inputs_only, тем не менее требовалось со стороны программы вписать в регистр GPIO_TRI =1 и все сразу у меня зачиталось и записалось.. :)

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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