Jump to content
    

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

 

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

 

тогда х66 надо еще и это учитывать, и понимать что так через кэш не пробьетесь в последних поколениях ниоса....

Share this post


Link to post
Share on other sites

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?

 

 

 

 

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

Потому что инкремент указателя на число увеличивает адрес на ширину этого числа. 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?

Edited by LAS9891

Share this post


Link to post
Share on other sites

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

 

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

Share this post


Link to post
Share on other sites

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

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

Напоминает сбои памяти.

Share this post


Link to post
Share on other sites

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

Напоминает сбои памяти.

 

Пробовал сначала обнулить ячейки, а потом записывать. В косячных ячейках нули появлялись не после записи нулей, а только после записи данных. А про тест памяти не расскажите или где почитать/посмотреть пример?

 

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.

×
×
  • Create New...