Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Курьезная ошибка в стандартной программе BOARD_GetRemap от Атмеля :)
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Dir
При разборе чужих полетов обнаружил курьезную ошибку в стандартной программе определения наличия ремапа (для 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 она идет в комплекте.
VladislavS
Если ремап был, то при записи в *ram это же значение появится и в *remap. Если не было, то в *remap будет содержимое ROM. Вроде всё верно.

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

А у вас что, плата сама может решить стартануть ремапнутой или нет?
Dir
Цитата(VladislavS @ Apr 3 2011, 16:31) *
Если ремап был, то при записи в *ram это же значение появится и в *remap. Если не было, то в *remap будет содержимое ROM. Вроде всё верно.
А у вас что, плата сама может решить стартануть ремапнутой или нет?


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

PS. А почему эта проблема оказалась такой непропорционально вероятной и завязана на танцы с бубнами тоже кажется начинаю понимать... Тут уже заслуга излишней (ИМХО) "виртуозности" программиста... Но это не по теме.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.