Dir 0 3 апреля, 2011 Опубликовано 3 апреля, 2011 · Жалоба При разборе чужих полетов обнаружил курьезную ошибку в стандартной программе определения наличия ремапа (для 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 39 3 апреля, 2011 Опубликовано 3 апреля, 2011 · Жалоба Если ремап был, то при записи в *ram это же значение появится и в *remap. Если не было, то в *remap будет содержимое ROM. Вроде всё верно. Плата периодически вела себя странно при старте А у вас что, плата сама может решить стартануть ремапнутой или нет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dir 0 3 апреля, 2011 Опубликовано 3 апреля, 2011 · Жалоба Если ремап был, то при записи в *ram это же значение появится и в *remap. Если не было, то в *remap будет содержимое ROM. Вроде всё верно. А у вас что, плата сама может решить стартануть ремапнутой или нет? Я и говорю, что есть вероятность неправильной работы. Небольшая (~1/sizeof(int)), но есть. Это когда содержимое 0 ячейки флэш равна *ram+1. Плата многофункциональная и разработана давно. Она может стартовать в нескольких режимах. Программист давно уволился и даже контактов с ним не осталось. И вот терпение из-за ее периодических фокусов при старте иссякло и начался разбор полетов. Пока еще не известно насколько виновата та причина, какую я обнаружил, т.к. воскресенье и платы у меня дома нет. Даже опешил слегка и засомневался... В принципе пока непонятно почему такая вероятность так сильно сказывается Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 3 апреля, 2011 Опубликовано 3 апреля, 2011 · Жалоба Чисто теоретически, согласен. Наверное, правильнее *ram = *remap + 1; Но практически, я не представляю как это может стать источником проблем. Вероятность намного ниже, чем 1/sizeof(int). Потому что, или это значение туда записала программа из ROM, или оно само при включении там появилось. Ни в том ни в другом случае равномерного распределения нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dir 0 3 апреля, 2011 Опубликовано 3 апреля, 2011 · Жалоба Если бы это была не стандартная программа Getting Started, поставляемая с оценочными китами, я бы и писать не стал. Обычно я такие вещи беру на веру без проверки, а тут крутился-крутился и обнаружил что проблема где-то еще за пределами main, т.е. фактически не программиста, а поставщика средств разработки... PS. А почему эта проблема оказалась такой непропорционально вероятной и завязана на танцы с бубнами тоже кажется начинаю понимать... Тут уже заслуга излишней (ИМХО) "виртуозности" программиста... Но это не по теме. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться