LINUX.ORG.RU

Пример из O'Reilly

 , ,


0

2

Добрый день. Разбираю пример из «Programming Embedded Systems, Second Edition with C and GNU Development Tools», касающийся тестирования памяти и непременно вылетаю в сегфолт. В примере ниже я пытаюсь пройтись по блоку размером 64 KB алгоритмом «шагающей единицы»

test.h

#ifndef _test_h
#define _test_h
/*
* Define NULL pointer value.
*/
#ifndef NULL
#define NULL (void *) 0
#endif
/*
* Set the data bus width.
*/
typedef unsigned long datum;
/*
* Function prototypes.
*/
datum  memTestDataBus(volatile datum * address);
#endif 

test.c

#include "test.h"

#define BASE_ADDRESS		(datum *)(0x00500000)
datum
memTestDataBus(volatile datum * address)
{
    datum pattern;
    /*
    * Perform a walking 1's test at the given address.
    */
    for (pattern = 1; pattern != 0; pattern <<= 1)
    {
        /*
        * Write the test pattern.
        */
        *address = pattern;
        /*
        * Read it back (immediately is okay for this test).
        */
        if (*address != pattern)
        {
            return (pattern);
        }
    }
    return (0);
}
int main(int argc, char **argv){
    memTestDataBus(BASE_ADDRESS);
    return 0;
}

В чём может быть ошибка?



Последнее исправление: cetjs2 (всего исправлений: 1)

В примере ниже я пытаюсь пройтись по блоку размером 64 KB

Где пытаешься?

UVV ★★★★★
()

тебя ОС по рукам бьет за то, что ты фиг пойми куда пишешь. Без ОС пример бы работал.

demidrol ★★★★★
()

Говорят, первая книга лучше. Во второй токо леды зажигать научат. Но в первой c++. Не всем хочется обмазываться плюсами на ембеддед.

anonymous
()
Ответ на: комментарий от UVV

Да, не пытаюсь. Это в другой функции задаётся размер - my bad.

hdclnr
() автор топика

приведи код полностью, и описание железа.

Сколько всего памяти то?

Deleted
()
Ответ на: комментарий от cvs-255

как тогда оно может вылетать в сегфолт

anonymous
()
Ответ на: комментарий от fero

Конечно. Какая зверушка придёт в голову Эди Фридман, та и будет на обложке.

ilammy ★★★
()

А в книге разве не сказано, что данный пример ни в одной современной многозадачной ОС работать не будет! И ошибка здесь в попытке записать что-либо в непринадлежащий программе участок памяти. Читать про защищенный режим процессора и защиту памяти.

sigurd ★★★★★
()
Ответ на: комментарий от sigurd

В Линуксе можно было обратиться к любому адресу памяти через /dev/kmem (По прайней мере для ядра 2.0 это работает). Т.е. открываем файл
mem_fd = open(«/dev/kmem», O_RDWR); затем примонтируем его кусок себе в адресное пространство:
kgm_mem = (char *) mmap( (void *) 0xD0000, KGM_MEM_LEN, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_FIXED, mem_fd, 0xD0000 );

Далее можем читать и писать в него через указатель kgm_mem. У меня по адресу 0xD0000 находится общая память (физическая) - т.е. память доступная на чтение и запись кроме ПК еще десятку управляющих контроллеров.

sigurd ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.