реклама на сайте
подробности

 
 
8 страниц V  « < 6 7 8  
Reply to this topicStart new topic
> NIOS II, программирование ниос2 на СИ
Golikov A.
сообщение Feb 6 2015, 10:50
Сообщение #106


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Я ниосом интересуюсь для общей эрудиции, мне позволительно без букваряsm.gif

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

тогда х66 надо еще и это учитывать, и понимать что так через кэш не пробьетесь в последних поколениях ниоса....
Go to the top of the page
 
+Quote Post
LAS9891
сообщение Feb 17 2017, 09:03
Сообщение #107


Местный
***

Группа: Участник
Сообщений: 206
Регистрация: 18-06-15
Пользователь №: 87 194



Цитата(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?



Go to the top of the page
 
+Quote Post
AVR
сообщение Feb 17 2017, 09:21
Сообщение #108


фанат Linux'а
*****

Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008



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

Потому что инкремент указателя на число увеличивает адрес на ширину этого числа. int 32 бита на этой платформе, вот на 4 байта и увеличило.


--------------------
Go to the top of the page
 
+Quote Post
LAS9891
сообщение Feb 17 2017, 09:37
Сообщение #109


Местный
***

Группа: Участник
Сообщений: 206
Регистрация: 18-06-15
Пользователь №: 87 194



Цитата(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 - Feb 17 2017, 09:54
Go to the top of the page
 
+Quote Post
LAS9891
сообщение Feb 17 2017, 11:05
Сообщение #110


Местный
***

Группа: Участник
Сообщений: 206
Регистрация: 18-06-15
Пользователь №: 87 194



Что за фигня творится:

Код
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
Go to the top of the page
 
+Quote Post
AVR
сообщение Feb 17 2017, 11:20
Сообщение #111


фанат Linux'а
*****

Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008



Цитата(LAS9891 @ Feb 17 2017, 14:05) *
Что за фигня творится:

Я бы обнулил всю память (записав нулевые байты), затем написал бы тест памяти, прежде чем играть с адресами sm.gif
Напоминает сбои памяти.


--------------------
Go to the top of the page
 
+Quote Post
LAS9891
сообщение Feb 17 2017, 11:34
Сообщение #112


Местный
***

Группа: Участник
Сообщений: 206
Регистрация: 18-06-15
Пользователь №: 87 194



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


Пробовал сначала обнулить ячейки, а потом записывать. В косячных ячейках нули появлялись не после записи нулей, а только после записи данных. А про тест памяти не расскажите или где почитать/посмотреть пример?
Go to the top of the page
 
+Quote Post

8 страниц V  « < 6 7 8
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th August 2025 - 12:08
Рейтинг@Mail.ru


Страница сгенерированна за 0.01565 секунд с 7
ELECTRONIX ©2004-2016