Тем не менее я проверил, 0 и 2 в другом месте назначаются.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Код: Выделить всё
if ((row < 2) && ((digit == i) || (digit == (i + 1)))) val = 0x10;Да всё также и будет. У "+" всяко приоритет выше, чем у "==".ARV писал(а):а так что будет?Код: Выделить всё
if ((row < 2) && ((digit == i) || (digit == (i + 1)))) val = 0x10;
Код: Выделить всё
in = digit + i; // т.е. in будет равен 0-1 или 4-5.
if ((row < 2) && ((in < 2) || (in > 3))) val = 0x10;
Код: Выделить всё
uint8_t bcd2bin(uint8_t value) {
return (value / 16) * 10 + (value % 16);
// return (value >> 4) * 10 + (value & 0x0F);
}
int main(void) {
uint8_t in, out;
in = PINB;
out = bcd2bin(in);
PORTC = out;
for(;;) {
}
}
во-первых, у вас 2 разных выражения, отсюда и разный объем при использовании одного и другого:Apparatchik писал(а):почему так происходит
во-вторых, если функция объявлена static и используется только в одном месте, она почти со 100% гарантией будет компилятором (оптимизатором) проинлайнена в коде. т.к. в этом случае нет накладных расходов на передачу параметров и возврат результата, это сокращает объем кода.Apparatchik писал(а): return (value / 16) * 10 + (value % 16);
// return (value >> 4) * 10 + (value & 0x0F);
В другом компиляторе (для STM32) эти выражения дают одинаковый по размеру код, вот я и подумал что оптимизатор их должен привести к одному и тому же. Если она static ведь оптимизатор дает одинаковый размер.ARV писал(а):во-первых, у вас 2 разных выражения, отсюда и разный объем при использовании одного и другого:
неисповедимы пути оптимизатора... смените версию avr-gcc и наверняка сможете получить еще один вариант...Apparatchik писал(а):вот я и подумал что оптимизатор их должен привести к одному и тому же
Код: Выделить всё
uint8_t bcd2bin(uint8_t value)
{
return (value >> 4) * 10 + (value & 0x0F);
//return (value / 16) * 10 + (value % 16);
}
mov r25, r24
swap r25
andi r25, 0x0F ; 15
andi r24, 0x0F ; 15
ldi r18, 0x0A ; 10
mul r25, r18
add r24, r0
eor r1, r1
retА вы сохрание asm выхлоп компилятора для обеих вариантов и сравните в каком-нибудь двухпанельном diff-e - сразу покажет, что там оптимизатор не так понял. Попробуйте сравнить варианты с частями выражения - до '+' и после него.Apparatchik писал(а):При таком коде занимает 88 байт флеша, если же раскоментировать строку со здвигом и закоментировать с делениями - 104 байта.
FeCat писал(а):Можно ли sizeof применять к одной из размерностей массива?
Код: Выделить всё
int aaa[2][3][4] = { 0 };
int z = sizeof(aaa);
int z1 = sizeof(aaa[0]);
int z2 = sizeof(aaa[0][0]);
int z3 = sizeof(aaa[0][0][0]);
_tprintf(_T("%d %d %d %d "), z, z1, z2, z3);
Код: Выделить всё
int aaa[6][7][8];
int z0 = sizeof(aaa);
int z1 = sizeof(aaa[0]);
int z2 = sizeof(aaa[0][0]);
int z3 = sizeof(aaa[0][0][0]);
printf("%d %d %d \n", z0/z1, z1/z2, z2/z3);Код: Выделить всё
#ifndef _countof
#define _countof(__a) (sizeof(__a) / sizeof(*__a))
#ednif
_tprintf(_T("%d %d %d"), _countof(aaa), _countof(aaa[0]), _countof(aaa[0][0]));
Код: Выделить всё
#define __IO volatile /*!< Defines 'read / write' permissions
__INLINE void FlashWord16Prog(uint32_t flash_addr, uint16_t data)
{
...
/* (2) Perform the data write (half-word) at the desired address */
*(__IO uint16_t*)(flash_addr) = data; /* (2) */
...
}Код: Выделить всё
volatile uint16_t *ptr;
*ptr = data;
ptr++;Ничего сложного. Значение data копируется в 16-битную ячейку памяти, на которую указывает ptr. Затем, инкремент смещает указатель так чтобы он указывал на следующую 16-битную ячейку. Ключевое слово volatile гарантирует, что запись в ячейку произойдет именно в этом месте (это так, по простому).uk8amk писал(а):Что здесь происходит?