Перейти к содержанию
    

Курьезная ошибка в стандартной программе BOARD_GetRemap от Атмеля :)

При разборе чужих полетов обнаружил курьезную ошибку в стандартной программе определения наличия ремапа (для AT91SAM7S-EK). Вот она

 

static unsigned char BOARD_GetRemap( void )
{
    unsigned int *remap = (unsigned int *) 0;
    unsigned int *ram = (unsigned int *) AT91C_ISRAM;
    // Try to write in 0 and see if this affects the RAM
    unsigned int temp = *ram;
    *ram = temp + 1;
    if (*remap == *ram) {
        *ram = temp;
        return BOARD_RAM;
    }
    else {
        *ram = temp;
        return BOARD_FLASH;
    }
}

 

При определении ремапа пишут не в *remap, а в *ram. Таким образом есть существенная вероятность неправильной работы. Плата периодически вела себя странно при старте, но никак не предполагали, что именно поэтому. Проверьте, пожалуйста, ничего я не напутал? Ведь тысячи же, наверное, людей пользовались этим пакетом. Неужели крохотная програмка так и осталась до сих пор неисправленной? По крайней мере с IAR EWB 6.10 она идет в комплекте.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если ремап был, то при записи в *ram это же значение появится и в *remap. Если не было, то в *remap будет содержимое ROM. Вроде всё верно.

 

Плата периодически вела себя странно при старте

А у вас что, плата сама может решить стартануть ремапнутой или нет?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если ремап был, то при записи в *ram это же значение появится и в *remap. Если не было, то в *remap будет содержимое ROM. Вроде всё верно.

А у вас что, плата сама может решить стартануть ремапнутой или нет?

 

Я и говорю, что есть вероятность неправильной работы. Небольшая (~1/sizeof(int)), но есть. Это когда содержимое 0 ячейки флэш равна *ram+1. Плата многофункциональная и разработана давно. Она может стартовать в нескольких режимах. Программист давно уволился и даже контактов с ним не осталось. И вот терпение из-за ее периодических фокусов при старте иссякло и начался разбор полетов. Пока еще не известно насколько виновата та причина, какую я обнаружил, т.к. воскресенье и платы у меня дома нет. Даже опешил слегка и засомневался... В принципе пока непонятно почему такая вероятность так сильно сказывается

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чисто теоретически, согласен. Наверное, правильнее *ram = *remap + 1;

Но практически, я не представляю как это может стать источником проблем. Вероятность намного ниже, чем 1/sizeof(int). Потому что, или это значение туда записала программа из ROM, или оно само при включении там появилось. Ни в том ни в другом случае равномерного распределения нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если бы это была не стандартная программа Getting Started, поставляемая с оценочными китами, я бы и писать не стал. Обычно я такие вещи беру на веру без проверки, а тут крутился-крутился и обнаружил что проблема где-то еще за пределами main, т.е. фактически не программиста, а поставщика средств разработки...

 

PS. А почему эта проблема оказалась такой непропорционально вероятной и завязана на танцы с бубнами тоже кажется начинаю понимать... Тут уже заслуга излишней (ИМХО) "виртуозности" программиста... Но это не по теме.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...