ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
19 апреля
620535 Топик полностью
vpv.vpv (21.09.2015 20:09, просмотров: 417) ответил Adept на ...не освоил IAR для "чего-то там", и не хочу!! :)) Нахрена мне изучать очередные костыли, чтобы якобы оптимально писать с их помощью программы. Ассемблер в этом случае гораздо "честнее" и легче, ибо, пока научишься и писать "оптимальные"
"Суха, мой друг, теория везде. А древо жизни пышно зеленеет" (с) Фауст Прорывы, технологии... "Множество камней, перекрывающих с лихвой" - они дороже стОят. Конкурент, предложивший похожий продукт за меньшие деньги - взял и подвинул не рынке. Для чего мы занимаемся программированием? Если для теоретизирования, построения концепций, любованием языка и пр., - это одно. Если для коммерческого использования своих продуктов, то это другое. Я думаю, полезно будет определить цель, смысл своей деятельности, что я хочу получить в итоге? Что касаемо меня, то я когда-то с корчами и потугами переполз-таки с PCAD 4.5 на ACCEL EDA и, после, на PCAD 2006. Так же переполз с Ассемблера X8085, X8051, AVRASM и пр., - на KEIL и после на IAR. Всё равно, что перейти с дров и лучины на газовую плиту и электрические фонари. Причем, это не означает отказ от лучины.., тьфу, от ассемблера :) Например, тот же IAR, когда натыкается на вызов функции внутри прерывания, начинает сохранять все без разбору. Это не нужно, и замедляет код. Используем ассемблер для "прелюдий": #pragma inline = forced void interrupt_entry (void) { asm(" movw r13:r12, r31:r30"); // сохранить Z - регистр asm(" movw r11:r10, r17:r16"); // сохранить R16 и R17 asm(" movw r9:r8, r19:r18"); // сохранить R18 и R19 asm(" movw r7:r6, r21:r20"); // сохранить R20 и R21 asm(" in r5, 0x3F"); // сохранить регистр флагов } #pragma inline = forced void interrupt_exit (void) { asm(" out 0x3F, r5"); // восстановить регистр флагов asm(" movw r21:r20, r7:r6"); // восстановить R20 и R21 asm(" movw r19:r18, r9:r8"); // восстановить R18 и R19 asm(" movw r17:r16, r11:r10"); // восстановить R16 и R17 asm(" movw r31:r30, r13:r12"); // восстановить Z - регистр } А далее, используем указатель на нужную функцию в перывании, но просим компилятор. чтобы он в прерывании ничего не сохранял: __interrupt __raw void irqOverflowTimer2 (void) { interrupt_entry (); TCCR2=0; // остановить Timer2 (* Ufunc_ptr)(); interrupt_exit (); } Этот "финт" дает оптимальный, самый компактный и быстрый код. При этом он прозрачен и понятен.