Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: NIOS II
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
Страницы: 1, 2, 3
Golikov A.
это если писать слово за словом, а первое обращение по адресу? неужто 1 такт?
Golikov A.
по ходу ДМА все таки придется ставить...
x66
Цитата(Golikov A. @ Jan 20 2015, 12:24) *
нет
потому что нужно адрес не
int addr_on_chip=0x4008000

а
int *addr_on_chip = (int *)0x4008000;

записать туда *addr_on_chip = 10;
считать оттуда
int Temp = *addr_on_chip;


при условии что 0x4008000 - это адрес в ДДР


смотрел код из документа an398.pdf там написано

unsigned int *led_address;
unsigned long *DDR_address; //long is 32 bits.
int led_value;
int addr;
int datar;
int ddr_data_out;
char packet[32];
DDR_address = (unsigned long *)0x80000000; //make non-cache
led_address = (unsigned int *)0x84008800; //make non-cache

В чем отличие *addr_on_chip = (int *)0x4008000 от addr_on_chip = (int *)0x4008000
Golikov A.
букварь по С надо почитать.
в чем отличие
int A;
от
int *A;
?

забавно что в вашем примере непонимание еще даже глубжеsm.gif

вам надо еще узнать разницу между

int *A;

и
*A просто, при условии что объявлено как int *A;


естественно в приведенном примере сделано правильно
переменная объявлена как указатель и адресу присвоено значение


меня вот комментарии интересуют
0x84008800; //make non-cache
то есть получается что адрес 4008800 - под кешем, а если поставить старшую единичку, то будет обращение в те же адреса, только без кеша?
так надо это понимать? То есть у ниоса тоже есть не кешируемое пространство, и в целом можно обращаться к портам через указатель, просто написав макрос добавления старшей единички? Или там как-то хитро ММУ настроен, что обращение в эти адреса порождает вызов спец команд?

---upd
перечитал некрасиво без ответа

int *A; - объявление указателя на int
int *A = (int *)ADDR; - объявление указателя на int и сразу задание указателю значения ADDR (ссылается на адрес ADDR)
A = (int *)ADDR; - задание значение указателю ADDR (ссылается на адрес ADDR)
*A = VALUE; - задание значения переменной на которую ссылается указатель
Stewart Little
Цитата(Golikov A. @ Feb 6 2015, 13:16) *
то есть получается что адрес 4008800 - под кешем, а если поставить старшую единичку, то будет обращение в те же адреса, только без кеша?
так надо это понимать?

Да, у NiosII gen1 именно так. "Буквать по ... надо почитать" (с) Ваше.

У NiosII gen2, кстати, кэширование делается уже по-другому.
Golikov A.
Я ниосом интересуюсь для общей эрудиции, мне позволительно без букваряsm.gif

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

тогда х66 надо еще и это учитывать, и понимать что так через кэш не пробьетесь в последних поколениях ниоса....
LAS9891
Цитата(Golikov A. @ Jan 20 2015, 12:24) *
int *addr_on_chip = (int *)0x4008000;

записать туда *addr_on_chip = 10;
считать оттуда
int Temp = *addr_on_chip;


при условии что 0x4008000 - это адрес в ДДР


Написал такой код:
Код
int *RAM_addr = (int *)SDRAM_BASE;

*RAM_addr = 0x01;
RAM_addr++;
*RAM_addr = 0x02;


Сначала записал в ячейку памяти с адресом SDRAM_BASE число 1. Затем прибавил к значению указателя RAM_addr единицу и записал по новому адресу число 2. SDRAM_BASE - базовый адрес SDRAM равный 0x8000000.

Потом посмотрел что находится в ячейках по адресам:
RAM_addr = (int *)SDRAM_BASE и RAM_addr = ((int *)SDRAM_BASE+1). Значения оказались соответственно 1 и 2.

Далее решил посмотреть значения указателя RAM_addr. Оказалось, что сначала RAM_addr = 0x8000000, а после команды RAM_addr++, значение указателя становится равным 0x800004. Почему так? Почему не 0x800001?



AVR
Цитата(LAS9891 @ Feb 17 2017, 12:03) *
Далее решил посмотреть значения указателя RAM_addr. Оказалось, что сначала RAM_addr = 0x8000000, а после команды RAM_addr++, значение указателя становится равным 0x800004. Почему так? Почему не 0x800001?

Потому что инкремент указателя на число увеличивает адрес на ширину этого числа. int 32 бита на этой платформе, вот на 4 байта и увеличило.
LAS9891
Цитата(AVR @ Feb 17 2017, 12:21) *
Потому что инкремент указателя на число увеличивает адрес на ширину этого числа. int 32 бита на этой платформе, вот на 4 байта и увеличило.

точно, спасибо. Переписал так:

Код
alt_u32 nextaddrram = SDRAM_BASE;
alt_u8 data = 0x00;
alt_u8 RAM_count=1;

for(RAM_count=1; RAM_count<9; RAM_count++)
    {
    *RAM_addr = RAM_count;
    RAM_addr=(alt_u32 *)nextaddrram;
    nextaddrram++;
    printf("Load RAM_addr=%x data=%x\n", (int)RAM_addr, (int)(*RAM_addr));
    }


В консоли вот что:
Load RAM_addr=8000000 data=1
Load RAM_addr=8000001 data=2
Load RAM_addr=8000002 data=3
Load RAM_addr=8000003 data=4
Load RAM_addr=8000004 data=8406d14
Load RAM_addr=8000005 data=6
Load RAM_addr=8000006 data=7
Load RAM_addr=8000007 data=8

Что случилось с ячейкой 8000004?
LAS9891
Что за фигня творится:

Код
int main()
{

alt_u32 *RAM_addr = (alt_u32 *)SDRAM_BASE;
alt_u32 nextaddrram = SDRAM_BASE;
alt_u8 RAM_count=1;

for(RAM_count=1; RAM_count<30; RAM_count++)
    {
    *RAM_addr = (alt_u32)RAM_count;
    RAM_addr=(alt_u32 *)nextaddrram;
    nextaddrram++;
    printf("Load RAM_addr=%x data=%d\n", (int)RAM_addr, (int)(*RAM_addr));
    }


Load RAM_addr=8000000 data=1
Load RAM_addr=8000001 data=2
Load RAM_addr=8000002 data=3
Load RAM_addr=8000003 data=4
Load RAM_addr=8000004 data=138439956
Load RAM_addr=8000005 data=6
Load RAM_addr=8000006 data=7
Load RAM_addr=8000007 data=8
Load RAM_addr=8000008 data=134244410
Load RAM_addr=8000009 data=10
Load RAM_addr=800000a data=11
Load RAM_addr=800000b data=12
Load RAM_addr=800000c data=0
Load RAM_addr=800000d data=14
Load RAM_addr=800000e data=15
Load RAM_addr=800000f data=16
Load RAM_addr=8000010 data=0
Load RAM_addr=8000011 data=18
Load RAM_addr=8000012 data=19
Load RAM_addr=8000013 data=20
Load RAM_addr=8000014 data=0
Load RAM_addr=8000015 data=22
Load RAM_addr=8000016 data=23
Load RAM_addr=8000017 data=24
Load RAM_addr=8000018 data=0
Load RAM_addr=8000019 data=26
Load RAM_addr=800001a data=27
Load RAM_addr=800001b data=28
Load RAM_addr=800001c data=0
AVR
Цитата(LAS9891 @ Feb 17 2017, 14:05) *
Что за фигня творится:

Я бы обнулил всю память (записав нулевые байты), затем написал бы тест памяти, прежде чем играть с адресами sm.gif
Напоминает сбои памяти.
LAS9891
Цитата(AVR @ Feb 17 2017, 14:20) *
Я бы обнулил всю память (записав нулевые байты), затем написал бы тест памяти, прежде чем играть с адресами sm.gif
Напоминает сбои памяти.


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