mSimple 0 1 июня, 2010 Опубликовано 1 июня, 2010 (изменено) · Жалоба Добрый день.. возникла такая проблема: 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 выполнялись без каких либо проблем, если оптимизация отключена была. Изменено 1 июня, 2010 пользователем mSimple Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
masics 0 2 июня, 2010 Опубликовано 2 июня, 2010 · Жалоба Попробуйте использовать 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mSimple 0 2 июня, 2010 Опубликовано 2 июня, 2010 · Жалоба Попробуйте использовать 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
masics 0 2 июня, 2010 Опубликовано 2 июня, 2010 · Жалоба Значит что-то поменялось в компиляторе - кто их знает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex77 4 2 июня, 2010 Опубликовано 2 июня, 2010 · Жалоба Спасибо.. помогло :) Но все равно странно, почему в 10.1 с PowerPC мне этого не требовалось, а в 12.1 c Microblaze потребовалось.. Я почему-то считал, что с точки зрения программиста они одинаковы.. ну, или это особенности новой среды 12.1 Всё законно. volatile это из стандарта на язык "с" именно для таких случаев. А вот компиляторы только следуют данному стандарту. И соответственно это просто криво написанная программа. А не особенности кого либо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mSimple 0 9 июня, 2010 Опубликовано 9 июня, 2010 · Жалоба Все, разобрался!... проблема была вовсе не в volatile и не коде программы, все дело в том, что читал я выход GPIO! В новой версии 12.1 GPIO устроен несколько по другому, чем в 10.1. Хотя GPIO у меня использовался как Inputs_only, тем не менее требовалось со стороны программы вписать в регистр GPIO_TRI =1 и все сразу у меня зачиталось и записалось.. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться