Цитата(Сергей Борщ @ Jan 21 2008, 15:19)

Тогда и надо писать if (Value > MinValue && Value < MaxValue). Код будет значительно компактнее и быстрее.
Т.е., как я понимаю, результат при сравнении операторами '&' или '&&' будет одинаков, за исключением того, что оператор '&' делает это побитно, а '&&' побайтно. Верно?
Цитата(Сергей Борщ @ Jan 21 2008, 15:19)

Тогда так и надо писать: MeanValue_CH1 = 0. NULL имеет тип указателя, удивительно что компиялтор пропустил такое присваивание (если только в режиме C++, но в нем как раз рекомендуется использовать 0 в том числе и для указателей вместо NULL).
В файле <stdio.h> NULL объявлена как 0:
#ifndef NULL
#define NULL (0)
#endif
И в других хидерах переопределений нет. Поэтому так и написал. А то, что NULL имеет тип указателя я и не знал.
Для надежности всё же исправил.
Цитата(forever failure @ Jan 21 2008, 15:42)

Логика такая: при выходе измеряемого напряжения (Value) за допустимые значения (MinValue и MaxValue) необходимо отключать питание системы.
Т.е. в данном случае, если условие соблюдается, то всё в порядке, иначе блокируем работу системы.
В отладчике проверял - работает. На практике проверял - тоже работает.Поэтому так и оставил.
Теперь исправил.
Цитата(SasaVitebsk @ Jan 21 2008, 15:52)

Либо локализуйте ошибку - либо выкиньте часть текста, до которого всё равно дело не доходит и тогда обращайтесь. Простите, это моё мнение.
По поводу оптимизации. В варианте со switch компилятор, тем не менее сам найдёт общие куски и объединит их. Я бы для начала отладил бы прогу в целом, а уж потом занялся оптимизацией проекта (если уж сразу не удалось написать оптимально). А то сейчас начать оптимизацию - это добавить новых ошибок.
Заметьте, отлаживать за себя я никого не просил. Я лишь хочу научиться правильно писать программу на практических советах уважаемых посетителей форума. Эти советы я думаю будут полезны и другим новичкам. Если человек с большим опытом, то ему не составит большого труда просмотрев код, даже не вникая в алгоритм, найти участки кода и сделать их более эффективными.
От свитча я вовсе избавился, действительно через массив оказалось всё просто, компактно и эффективно.
Оптимизация у меня давно выставлена по размеру и я её больше не трогаю с тех пор как компилятор по мере реализации новых фунций начал выдавать такие сообщения:
Код
Building configuration: pwr_control - Release
Updating build tree...
main.c
Linking
Error[e16]: Segment CODE (size: 0x202e align: 0x1) is too long for segment definition. At least 0xa0 more bytes
needed. The problem occurred while processing the segment placement command
"-Z(CODE)CODE=26-1FFF", where at the moment of placement the available memory ranges were
"CODE:72-1fff"
Reserved ranges relevant to this placement:
CODE:26-3d NEAR_F
CODE:3e-65 SWITCH
CODE:66-71 INITTAB
CODE:72-1fff ?FILL1
Error[e16]: Segment TINY_ID (size: 0 align: 0) is too long for segment definition. At least 0 more bytes needed.
The problem occurred while processing the segment placement command
"-Z(CODE)TINY_ID,NEAR_ID=26-1FFF", where at the moment of placement the available memory ranges
were "-none-"
Reserved ranges relevant to this placement:
CODE:26-3d NEAR_F
CODE:3e-65 SWITCH
CODE:66-71 INITTAB
CODE:72-1fff ?FILL1
Error[e16]: Segment NEAR_ID (size: 0xe1 align: 0) is too long for segment definition. At least 0xe1 more bytes
needed. The problem occurred while processing the segment placement command
"-Z(CODE)TINY_ID,NEAR_ID=26-1FFF", where at the moment of placement the available memory ranges
were "-none-"
Reserved ranges relevant to this placement:
CODE:26-3d NEAR_F
CODE:3e-65 SWITCH
CODE:66-71 INITTAB
CODE:72-1fff ?FILL1
Error[e16]: Segment CHECKSUM (size: 0x2 align: 0) is too long for segment definition. At least 0x2 more bytes
needed. The problem occurred while processing the segment placement command
"-Z(CODE)CHECKSUM#1FFF", where at the moment of placement the available memory ranges were
"-none-"
Reserved ranges relevant to this placement:
CODE:0-17 INTVEC
CODE:18-25 NEAR_ID
CODE:26-3d NEAR_F
CODE:3e-65 SWITCH
CODE:66-71 INITTAB
CODE:72-1fff ?FILL1
Error[e18]: Range error,
Address out of range. Valid range is 0 to 8190 (0x1FFE).
File: E:\_CRYPTOSOFT\PWR_CONTROL\SRC\util.c, Line: 240
Source: RCALL ?PROLOGUE4_L09
Where $ = slow_crc16 [0x370]
in module "main" (E:\_CRYPTOSOFT\PWR_CONTROL\SRC\Release\Obj\main.r90),
offset 0x0 in segment part 159, segment CODE
What: ?PROLOGUE4_L09 [0x2000]
Allowed range: 0x0 - 0x1FFE
Operand: ?PROLOGUE4_L09 [0x2000]
in module ?PROLOGUE_L09 (D:\Program Files\IAR Systems\Embedded Workbench 4.0 Evaluation\
avr\LIB\CLIB\cl1s-ec_mul.r90),
Offset 0x0 in segment part 12, segment CODE
Error[e18]: Range error,
Address out of range. Valid range is 0 to 8190 (0x1FFE).
File: E:\_CRYPTOSOFT\PWR_CONTROL\SRC\util.c, Line: 257
Source: RJMP ?EPILOGUE_B4_L09
Where $ = slow_crc16 + 0x56 [0x3C6]
in module "main" (E:\_CRYPTOSOFT\PWR_CONTROL\SRC\Release\Obj\main.r90),
offset 0x56 in segment part 159, segment CODE
What: ?EPILOGUE_B4_L09 [0x201A]
Allowed range: 0x0 - 0x1FFE
Operand: ?EPILOGUE_B4_L09 [0x201a]
in module ?EPILOGUE_B_L09 (D:\Program Files\IAR Systems\Embedded Workbench 4.0 Evaluation\
avr\LIB\CLIB\cl1s-ec_mul.r90),
Offset 0x0 in segment part 12, segment CODE
Error[e18]: Range error,
Address out of range. Valid range is 0 to 8190 (0x1FFE).
File: E:\_CRYPTOSOFT\PWR_CONTROL\SRC\rdc.c, Line: 29
Source: RCALL ?PROLOGUE2_L09
Where $ = BeginDataWriteToRDC [0x3C8]
in module "main" (E:\_CRYPTOSOFT\PWR_CONTROL\SRC\Release\Obj\main.r90),
offset 0x0 in segment part 160, segment CODE
What: ?PROLOGUE2_L09 [0x2004]
Allowed range: 0x0 - 0x1FFE
Operand: ?PROLOGUE2_L09 [0x2004]
in module ?PROLOGUE_L09 (D:\Program Files\IAR Systems\Embedded Workbench 4.0 Evaluation\
avr\LIB\CLIB\cl1s-ec_mul.r90),
Offset 0x0 in segment part 14, segment CODE
.......
ну и так далее
.......
Total number of errors: 33
Total number of warnings: 0
Ну я и воткнул оптимизацию по размеру на максимум. Всё работает, но вот елси разрешить выполнение следующего кода:
Код
#if(CheckMCU)
sum = slow_crc16(sum,(unsigned char __flash *)0, (unsigned long)&__checksum);
// call with two 0 bytes for the correct calculation of crc
sum = slow_crc16(sum,(unsigned char __flash *)&zero,2);
...
#endif
то прошивка лобо вообще не запускается либо запускается через раз. А по отдельности эти части кода фунциклируют по честному.
Цитата(defunct @ Jan 21 2008, 16:04)

А я сначала и объявлял переменные через структуру. Только не смог передать содержимое структуры не в массив, не напрямую в eeprom. Я вообще не знал про эту функцию:
Код
memcpy( &BufLog[ 1 ], &rtcTime, sizeof( rtcTime ));
А каким образом можно без неё вообще обойтись и записывать структуру непосредственно в eeprom?
Спасибо за дельный совет.