... можно поступить, как, например, в Паскале - 1-ый элемент хранит размер массива
типа перед каждым обращением к массиву ставить проверку не обращаешься ли ты "за границу" массива??
а компилятор, неможет сам прощитать "все варианты работы программы" и если найдет косяки - сообщить об этом пользователю?? Понимаю, что займет много времени, но яб согласился и часик подождать.
дело в том, что язык Си изначально построен по принципу "программисту виднее", т.е. компилятор обязан показывать только явно грубые ошибки и немного "подозрительных" варнингов, но вот контроль размерности массивов и значений указателей никогда компилятором Си не контролировались (и вряд ли будут). поэтому ваши надежды напрасны - хотите такого контроля, программируйте на Pascal или других языках со строгой типизацией и контролем (говорят, Ada в этом отношении страшно четкий язык, даже значение параметров функций способен контролировать)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Не хочет работать в Proteus. При входе в эту функцию, мк виснет. Но прерывания идут, и часовая микросхема успешно опрашивается по i2c.
Такая конструкция идет на ура:
Чей это косяк? в МК такое очень палевно заливать...
O-LED писал(а):Так вот, если в программе ошибочно обратиться к шестому элементу массива mass1, то он "без зазрения совести" принимает значение первого элемента массива mass2. Очень трудно уловимый глюк был..... Подскажите, есть ли способ как то обезопасить себя от таких случаев в будущем??
у меня тоже было такое, давно в курсе что за трабла но до сих пор это еще не исправил
Опыт приходит сразу после того, как он был нужен...
подскажите пож. Proteus корректно работает с памятью eeprom ?
чтото программа не пишет данные во время симуляции, а на реальном МК(атмега8) все работает ок.
подскажите пож. Proteus корректно работает с памятью eeprom ?
чтото программа не пишет данные во время симуляции, а на реальном МК(атмега8) все работает ок.
У нормально меня пишет с помощью стандартных СИшных функций из даташита.
Опыт приходит сразу после того, как он был нужен...
подскажите пож. Proteus корректно работает с памятью eeprom ?
чтото программа не пишет данные во время симуляции, а на реальном МК(атмега8) все работает ок.
У нормально меня пишет с помощью стандартных СИшных функций из даташита.
я взял пример из CVAVR.. возможно он будет работать не во всех случаях на реальном МК?
Волосатый писал(а):
Мне кажется лучше брать стандартный код из даташита на ваш камешек, ну или хотябы на семейство МК.
согласен. но функция по даташиту пишет по абсолютным адресам епром, - неудобно работать с переменными. а возможно я просто неправильно все понимаю.
ладно ,попробую делать как CV рекомендует
за версиями протеусе не слежу, но знаю, что в одной из не очень свежих версий был такой баг: по какому бы адресу не писалось в EEPROM, протеус всегда писал с нулевого адреса. для устранения этой проблемы был даже патч какой-то.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
ARV писал(а):за версиями протеусе не слежу, но знаю, что в одной из не очень свежих версий был такой баг: по какому бы адресу не писалось в EEPROM, протеус всегда писал с нулевого адреса. для устранения этой проблемы был даже патч какой-то.
начинаю понимать что это проблема связки CV - Proteus.
так что на время отладки поместил все RAM .
//==================eep_read====================
u8 eep_read(u16 addr) {
/* Ожидание завершения предыдущей записи*/
while(EECR & (1<<EEWE))
;
/* Установка адресного регистра */
EEAR = addr;
/* Разрешение чтения из ЭППЗУ путем установки EERE */
EECR |= (1<<EERE);
/* Возврат данных из регистра данных ЭСППЗУ*/
return EEDR;
}
//----------------------------------------------
Все из даташита...
Опыт приходит сразу после того, как он был нужен...
Ну и я сюда пожалуюсь....может кто поможет...
делаю простейшую операцию...хочу сохранить калибровочный флоат в еепромину а потом его оттуда в рам закопировать
я не спорю что чтото да и кривое...я сейчас через юнион и 4 чара сохраняю и читаю ... но..
а какая у Вас версия компилятору? официалка или уже сразу с 111111111 в ключе?
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
а вы обратили внимание что там нет флоата?
эти переменные сейчас это eeprom char ee_clocks[4]!!!
вот если бы вместо этого изврата поставить сразу флоат....
лонг кстати пишет нормально...4 байта...
наверное переустановлю свою кодвижну....и буду таки уходить от флоатов...много они памяти жрут...особенно их вывод на экран...
так то через унион у меня всё получилось и работает...но....пришло время немного экономить каждый байт...вчера вон не меняя вообще логики программы сэкономил 4 процента флеши...было 100% занято а сейчас 97
но если уйти из флоата то было бы очень хорошо....
просто интересно почему и только ли это у меня запись eeprom float a=8000000; превращается в какой-то бред а когда потом копируеш это значвение в РАМовский буффер float b=a; то в b потом получается какой-то бред несусветный...