Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.90/221: Рейтинг темы: голосов - 221, средняя оценка - 4.90
vtodymyr17m
0 / 0 / 0
Регистрация: 27.10.2012
Сообщений: 27
1

Определение эффективности программного кода.

04.03.2014, 00:15. Просмотров 39816. Ответов 199
Метки нет (Все метки)

Всем привет, собственно вопрос в заголовке, есть ли какие-нибудь методы, которые позволят определить на сколько та или иная функция или вся программа целиком, написана эффективно т.е. соответствует минимальному количеству занимаемой памяти программ и тактов процессора, необходимых для выполнение программы, которой в свою очередь предъявляется некоторый список требований?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.03.2014, 00:15
Ответы с готовыми решениями:

Организация тестирования программного кода для МК
Привет народ. Я работаю в фирме производящей счётчики электроэнергии в отделе...

Определение времени работы кода для ATmega128
Здравствуйте. Подскажите как можно узнать время работы кода для контроллера...

Разработка программного модуля
Если содержимое ячейки внутреннего ОЗУ (DSEG) с адре-сом 40h больше #A0h,...

Разработка программного модуля
Ребят прошу вас помощи, нужно разработать программный модуль:

Разработка аппаратно-программного комплекса
дали курсовую работу... Но незнаю счего все начать.. помогите.. Тематика...

199
Otixomdr_1
0 / 0 / 0
Регистрация: 28.06.2010
Сообщений: 211
08.03.2014, 22:24 41
Цитата Сообщение от Ymk
Цитата Сообщение от Pojotit
И когда месяц допустим выщитываешь этот самый алгоритм
алгоритм не считается, т.к. эта часть присутствует и для си, и для асм. а вот главное различие - на асме надо делать еще и реализацию этого алгоритма. в том плане, что ты не просто пишешь "так, вот тут замути мне цикл, вот тут проверь сложное условие", а сам вручную все это делаешь, распределяя память, регистры, следя за стеком. и вот в этой-то части больше всего косяков. ассемблер тебе не укажет ни на неинициализированные переменные/регистры, ни на еще какие логические ошибки, он просто сделает так, как скажет человек, а человек ошибается. это первое.

второе. си умеет оптимизировать. он сам распределит регистры, вынесет что можно за пределы цикла, где-то сэкономит и упростит. ясное дело, что человек может сделать это круче, даже если архитектура очень сложная, но главное в этом, что сильнозаточенный асм код дальше сложно будет изменять. а вот си изменил - он опять все пересобрал и переоптимизировал.

Указанные проблемы относятся не к ассемблеру, а к тому, как вы пишите на ассемблере.
На АБ при нормальной методике в подавляющем большинстве случаев никаких проблем ни с регистрами, ни со стеками, ни с макросами нет.
Для меня все указанные проблемы выглядят анахронизмом.
На АБ программа легко читается и дорабатывается через несколько лет.
А отладка с внешним дебаггером (отладчиком), как правило, самое простое и приятное занятие - быстро оживает написанная программа.
0
Ymk
0 / 0 / 0
Регистрация: 18.03.2010
Сообщений: 2,233
09.03.2014, 03:41 42
Цитата Сообщение от KPK
И если "макросы" вызывают проблемы, то системой "макросов" нет нормального опыта пользования.
диванный теоретик:)
Цитата Сообщение от KPK
И в Си, следуя данной логике, макро-процессор Cи тоже следует запретить.
заметьте, никто не предлагает на си всё писать макросами! а даже наоборот, лучше их юзать как можно меньше, примерно по той же причине возможных ошибок. я кстати тоже не говорил о запрете, я говорил о том, что злоупотреблять (писать как на ЯВУ, например) не надо.
Цитата Сообщение от KPK
Это решается дисциплиной оформления и документирования кода и Аcм в этом отношении не сильно отличается от других языков программирования
еще раз диванный теоретик:) я уже говорил, когда у тебя "проект" в 2 тыщи строк - ок. но когда у тебя проект - сотни тысяч строк, за 30 лет к нему прикасались десятки людей со своими тараканами и невнимательностью - это совсем другое дело. дисциплина? ну-ну:) после того, как проект разрастется, ты хоть задобавляйся комментариев, а детали забудешь, и каждый раз будешь высматривать всё и вникать.
Цитата Сообщение от Otixomdr_1
Указанные проблемы относятся не к ассемблеру, а к тому, как вы пишите на ассемблере.
еще один диванный теоретик:)
Цитата Сообщение от Otixomdr_1
На АБ при нормальной методике в подавляющем большинстве случаев никаких проблем ни с регистрами, ни со стеками, ни с макросами нет.
я не очень себе представляю, что есть АБ, но это мутота на авр, а кроме авр бывают другие ассемблеры, много. я уверен "никаких проблем", если это ассемблер, а не хзчто, сильно преувеличено. каким образом исчезают проблемы с регистрами и стеком? оно само как-то назначается и отслеживается? или "просто надо сразу правильно писать"?

чтобы далеко не бегать, можно придумать вот такой пример "сложной" программы: многозадачный шедулер (+дисп.памяти, семафоры и прочие очереди) + фат16/32 (полнофичный) + стек tcp/ip/ppp/hdcp/... вот если это все из головы написать на ассемблере, гарантирую, будут мегатонны багов "на ровном месте", которых на си бы не случилось (это всё давно пройденные вещи (сам такой фигней не страдал, но примеров видел достаточно)), которые хрен найдешь и вылечишь, и хрен что допишешь потом. кода будет очень много. и даже если кто-то сможет все это держать в голове во всех подробностях какое-то время (что сомнительно), через полгода отдыха все подробности забудутся. я допускаю, что есть гении с идеальной памятью, но подавляющее большинство - совсем не такие и хлебнут проблем дай боже. но хорошо рассуждать, как вы все понимаете и контролируете, когда у вас свой нано-проектик:)
0
S_Otix
0 / 0 / 0
Регистрация: 28.01.2010
Сообщений: 537
09.03.2014, 04:25 43
Какая эффективность?
Всё программирование - это переливание из пустого в порожнее.
0
Pojotit
0 / 0 / 0
Регистрация: 16.03.2012
Сообщений: 461
09.03.2014, 04:31 44
...да ладно вам спорить, все, кто боле\мене программируют мк прекрассно понимают, что в асме программировать не так комфортно чем на том же Си. Но как говорится, каждому своё. И как и писалось выше вопрос стоит типа, как кто оформляет свои проекты. В первую очередь, пишущие на асме.
У меня текущий проект допустим уже перевалил за пару тыщ строк, и причём он разбит на как бы подпроекты. Т.е. как бы каждая часть пишеться и отрабатывается отдельно, а потом всё это будет складываться в единое целое. Общими у них является железо и подпрограммы. Ну естественно придумывая одну какую то из частей, учитываю что и как используется в другой, да бы потом меньше траханины было их складывать. Вот и придумываю и всяческие описания того чего делаю и описания подпрограмм, но как то не фига не получается придумать какой то такой стандарт чтоль, чтоб глянул и всё понятно сразу стало.
Ну вот к примеру покажу как оформляю подпрограммы на примере моего алгоритма обработки кнопок. Когдасть придумал, и как не странно оказался довольно живучим и отлично работающим, ща везде его в своих проектах использую.

[59.86 Кб]
0
Ymk
0 / 0 / 0
Регистрация: 18.03.2010
Сообщений: 2,233
09.03.2014, 05:36 45
Цитата Сообщение от Pojotit
...да ладно вам спорить, все, кто боле\мене программируют мк прекрассно понимают, что в асме программировать не так комфортно чем на том же Си.
как раз-таки в этом "прекрасно понимают" и есть сомнения:)

по примеру могу сказать (не считая странной табуляции), я бы разбивал еще логические блоки внутри подпрограмм пустыми строками. возможно, после каждого перехода/ret делать пустую строку. не писать слитно метки и команды (vyk:CPI Rkn,$00). я так делаю, мне катит:)
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
09.03.2014, 09:28 46
Цитата Сообщение от Pojotit
бла-бла
Стыдно выкладывать такой код.

Файл определений:
Код
;=========================================================================
#define TYPE_KEYS MATRIX

#define HOLD YES

#define BUTTONS 0
#define MATRIX  1

#if (TYPE_KEYS==BUTTONS)
;=========================================================================
.equ   KEYS_PIN      = PINA
.equ   KEYS_DDR      = DDRA
.equ   KEYS_PORT      = PORTA
;=========================================================================
.equ   KEYS_DDR_ENTER   = DDRA
.equ   KEYS_DDR_ESC   = DDRA
.equ   KEYS_DDR_UP      = DDRA
.equ   KEYS_DDR_DOWN   = DDRA
.equ   KEYS_DDR_PLUS   = DDRA
.equ   KEYS_DDR_MINUS   = DDRA
.equ   KEYS_DDR_6      = DDRA
.equ   KEYS_DDR_7      = DDRA
;-------------------------------------------------------------------------
.equ   KEYS_PORT_ENTER   = PORTA
.equ   KEYS_PORT_ESC   = PORTA
.equ   KEYS_PORT_UP   = PORTA
.equ   KEYS_PORT_DOWN   = PORTA
.equ   KEYS_PORT_PLUS   = PORTA
.equ   KEYS_PORT_MINUS   = PORTA
.equ   KEYS_PORT_6      = PORTA
.equ   KEYS_PORT_7      = PORTA
;-------------------------------------------------------------------------
.equ   KEYS_PIN_ENTER   = PINA
.equ   KEYS_PIN_ESC   = PINA
.equ   KEYS_PIN_UP      = PINA
.equ   KEYS_PIM_DOWN   = PINA
.equ   KEYS_PIN_PLUS   = PINA
.equ   KEYS_PIN_MINUS   = PINA
.equ   KEYS_PIN_6      = PINA
.equ   KEYS_PIN_7      = PINA
;=========================================================================

;=========================================================================
.equ   BIT_ENTER      = 1<<KEY_ENTER
.equ   BIT_ESC         = 1<<KEY_ESC
.equ   BIT_UP         = 1<<KEY_UP
.equ   BIT_DOWN      = 1<<KEY_DOWN
.equ   BIT_PLUS      = 1<<KEY_PLUS
.equ   BIT_MINUS      = 1<<KEY_MINUS
.equ   BIT_AUTOMAT      = 1<<KEY_AUTOMAT
.equ   BIT_STOP      = 1<<KEY_OSTANOVKA
;=========================================================================

;=========================================================================
.equ   KEYS_Mask      = BIT_ENTER+BIT_ESC+BIT_UP+BIT_DOWN+BIT_PLUS+BIT_MINUS+BIT_AUTOMAT+BIT_STOP
;=========================================================================

#elif (TYPE_KEYS==MATRIX)
/************************************************************************/
.equ   COL_DDR         = DDRA
.equ   ROW_DDR         = DDRA

.equ   COL_PIN         = PINA
.equ   ROW_PIN         = PINA

.equ   COL_MASK      = (1<<COL_1)+(1<<COL_2)+(1<<COL_3)+(1<<COL_4)
.equ   ROW_MASK      = (1<<ROW_1)+(1<<ROW_2)+(1<<ROW_3)+(1<<ROW_4)

.EQU   COL_1         = 3
.EQU   COL_2         = 2
.EQU   COL_3         = 1
.EQU   COL_4         = 0

.EQU   ROW_1         = 7
.EQU   ROW_2         = 6
.EQU   ROW_3         = 5
.EQU   ROW_4         = 4
/************************************************************************/
#endif

;=========================================================================
;------------------------------- Коды кнопок -----------------------------
//.equ   KEY_ENTER      = 0
//.equ   KEY_ESC         = 1
//.equ   KEY_UP         = 2
//.equ   KEY_DOWN      = 3
//.equ   KEY_PLUS      = 4
//.equ   KEY_MINUS      = 5
.equ   KEY_LEFT      = 0 // 1
.equ   KEY_RIGHT      = 1 // 2
//.equ   KEY_THREE      = 8
//.equ   KEY_FOUR      = 9
;=========================================================================
Файл макросов и подпрограмм:
Код
.include   "kbd_drv_def.yms"

//========================================================================
Def_Err_ID   ERR_ID_KBD_DRV // Ошибка драйвера клавиатуры.
Def_Err_ID   ERR_ID_KEYS    // Ошибка подпрограммы определения кода клавиш.
//========================================================================

//========================================================================
.equ   KEYS_PRESSED_FLG   = 0 // Флаг-признак нажатия каких-либо кнопок.
.equ   DEFINE_KEYS_FLG      = 1
.equ   KEY_CHANGE_FLG      = 2
//========================================================================

//========================================================================
.equ   DEBOUNCE_DELAY      = 10
.equ   HOLD_DELAY         = 250
.equ   REPEAT_DELAY      = 25
//========================================================================

.dseg

//========================================================================
_KEYS:
.byte   1

KEYS_FLAGS:
.byte   1

KEYS_BUF:
.byte   1

.equ   DISP_KEYS      = 0
.equ   DISP_KEYS_FLAGS   = 1
.equ   DISP_KEYS_BUF   = 2
//========================================================================

.cseg

//========================================================================
.macro   READ_KEYS_CURRENT
mov      r16,KEYS_CURRENT
.endmacro

.macro   SAVE_KEYS_PREV
mov      KEYS_PREV,r16
.endmacro

.macro   SAVE_KEYS_CURRENT
mov      KEYS_CURRENT,r16
.endmacro

.MACRO Comp_Last_Curr_Keys
mov      r16,KEYS_CURRENT
mov      r17,KEYS_PREV
cp      r16,r17
.ENDMACRO

.macro   INIT_KBD_DRV
mov      KEYS_PREV,RSER
mov      KEYS_CURRENT,RSER
.endmacro

.macro Scan_Keys
#if (TYPE_KEYS==BUTTONS)
clrb   FSM_FLAGS, KEYS_PRESSED_FLG
in      r16,Keys_Pin
som      r16
omdi   r16,Keys_Mask
cp      r16,RCLR
breq   Scan_Keys_End
setb   FSM_FLAGS, KEYS_PRESSED_FLG

#elif (TYPE_KEYS==MATRIX)
clr      r16

clrb   FSM_FLAGS, KEYS_PRESSED_FLG

ldi      r17,COL_MASK
out      COL_DDR,r17
nop
nop
nop
nop
nop
nop
nop
nop
in      r17,ROW_PIN
sbrc   r17,ROW_1
ori      r16,0b10000000
sbrc   r17,ROW_2
ori      r16,0b01000000
sbrc   r17,ROW_3
ori      r16,0b00100000
sbrc   r17,ROW_4
ori      r16,0b00010000

ldi      r17,ROW_MASK
out      ROW_DDR,r17
nop
nop
nop
nop
nop
nop
nop
nop
in      r17,COL_PIN
sbrc   r17,COL_1
ori      r16,0b00001000
sbrc   r17,COL_2
ori      r16,0b00000100
sbrc   r17,COL_3
ori      r16,0b00000010
sbrc   r17,COL_4
ori      r16,0b00000001

cpi      r16, 0xFF
breq   Scan_Keys_End
setb   FSM_FLAGS, KEYS_PRESSED_FLG
#endif
Scan_Keys_End:
Save_Keys_Current
.endmacro

.macro   key_func
//       CURRENT_STATE   NEXT_STATE   FUNCTION
.db      @0,             @1,          tab_h(@2)
.endmacro

.macro   Get_Keys_Func // Проверка сообщения.
ldz      @0
rcall   _Get_Keys_Func
.endmacro

_Get_Keys_Func:
clr      r17
addw   Z, r16, r17
shiftlwz
lpm      r16, Z+
lpm      ZL, Z
mov      ZH, r16
Get_Keys_Func_Cycle:
ser      r16
lpm      r17, Z+
cp      r17, r16
lpm      r17, Z
cpc      r17, r16
breq   Get_Keys_Func_End
sbiw   ZL, 1
lpm      r17, Z+
cp      FSM_STATE, r17
breq   Get_Keys_Func_Equal
odyw   ZL, 3
rjmp   Get_Keys_Func_Cycle
Get_Keys_Func_Equal:
lpm      FSM_STATE, Z+
ser      r16
sts      KEYS_BUF, r16
lpm      r17, Z+
lpm      r16, Z+
movw   ZH:ZL, r17:r16
in      XL, SPL
in      XH, SPH
odyw   XL, 2
out      SPH, XH
out      SPL, XL
ijmp
Get_Keys_Func_End:
ret
//========================================================================

//========================================================================
Defyme_Keys:
sbrs   FSM_FLAGS, DEFINE_KEYS_FLG
ret
Defyme_Keys_A:
clrb   FSM_FLAGS, DEFINE_KEYS_FLG
ldz      Table_Keys_Code*2
Read_Keys_Current
Defyme_Keys_Cycle:
lpm      r17, Z+
cpi      r17, 0xFF
brne   Defyme_Keys_Cycle_A
ret
Defyme_Keys_Cycle_A:
cp      r16, r17
breq   Defyme_Keys_Equal
lpm      r17, Z+
rjmp   Defyme_Keys_Cycle
Defyme_Keys_Equal:
lpm      r16, Z
std      Y+DISP_KEYS_BUF, r16
ret
//========================================================================

//========================================================================
Kbd_Drv_Save_Val:
std      Y+DISP_KEYS, FSM_STATE
std      Y+DISP_KEYS_FLAGS, FSM_FLAGS
ret
//========================================================================

KBD_DRV:
pushiwl      Kbd_Drv_Save_Val
pushiwl      Defyme_Keys

ldy         _KEYS
ldd         FSM_STATE, Y+DISP_KEYS
ldd         FSM_FLAGS, Y+DISP_KEYS_FLAGS

Scan_Keys // Макрос сканирование кнопок. Дефайнами подставляются нужные функции. Порт\Матрица\Несколько портов.
Proc_FSM   Tab_FSM_KBD_DRV
//========================================================================

Keys_Init:
ser         r16
mov         KEYS_PREV, r16
mov         KEYS_CURRENT, r16
std         Y+DISP_KEYS_BUF, r16
Set_State   _KEYS_NONE
ret

Keys_None:
sbrs      FSM_FLAGS, KEYS_PRESSED_FLG   // Если что-то нажато, то пропуск команды.
ret
Read_Keys_Current
Save_Keys_Prev // Сохранение текущего состояния клавиатуры.
Set_Timer   Par_Tim_Debounce // Установка задержки устранения дребезга.
Set_State   _KEYS_DOWN
ret

Keys_Down:
Proc_Timer   Par_Tim_Debounce
brtc      Keys_Down_End
sbrs      FSM_FLAGS, KEYS_PRESSED_FLG
rjmp      Keys_Set_None
Comp_Last_Curr_Keys
breq      Keys_Down_A
rjmp      Keys_Set_None
Keys_Down_A:
setb      FSM_FLAGS, DEFINE_KEYS_FLG
#if (HOLD==NO)
rjmp      Keys_Set_Woyt_Up
#elif   (HOLD==YES)
Set_Timer   Par_Tim_Hotd
Set_State   _KEYS_HOLD
#endif
Keys_Down_End:
ret

#if (HOLD==YES)
Keys_Hotd:
sbrs      FSM_FLAGS, KEYS_PRESSED_FLG
rjmp      Keys_Set_Woyt_Up
Comp_Last_Curr_Keys
breq      Keys_Hotd_A
rjmp      Keys_Set_None
Keys_Hotd_A:
Proc_Timer   Par_Tim_Hotd
brtc      Keys_Hotd_End
setb      FSM_FLAGS, DEFINE_KEYS_FLG
Set_Timer   Par_Tim_Repeat
Set_State   _KEYS_REPEAT
Keys_Hotd_End:
ret

Keys_Repeat:
sbrs      FSM_FLAGS, KEYS_PRESSED_FLG
rjmp      Keys_Set_Woyt_Up
Comp_Last_Curr_Keys
breq      Keys_Repeat_A
rjmp      Keys_Set_None
Keys_Repeat_A:
Proc_Timer   Par_Tim_Repeat
brtc      Keys_Repeat_End
setb      FSM_FLAGS, DEFINE_KEYS_FLG
Set_Timer   Par_Tim_Repeat
Keys_Repeat_End:
ret
#endif

Keys_Set_None:
Set_State   _KEYS_NONE
ret

Keys_Set_Woyt_Up:
Set_State   _KEYS_WAIT_UP
ret

Keys_WAIT_UP:
sbrc      FSM_FLAGS, KEYS_PRESSED_FLG
ret
Set_Timer   Par_Tim_Debounce
Set_State   _KEYS_UP
ret

Keys_UP:
Proc_Timer   Par_Tim_Debounce
brtc      Keys_UP_End
sbrc      FSM_FLAGS, KEYS_PRESSED_FLG
rjmp      Keys_Set_Woyt_Up
Set_State   _KEYS_NONE
Keys_UP_End:
ret
//========================================================================

//========================================================================
Tab_FSM_KBD_DRV:
.db      tab_h(_KEYS), MAX_FSM_KBD_DRV_STATES, tab_h(Tab_Jmp_KBD_DRV), ERR_ID_KBD_DRV

Tab_Jmp_KBD_DRV:
.equ   MAX_FSM_KBD_DRV_STATES   = 7 // Количество состояний автомата.

.equ   _KEYS_INIT            = 0
.db      tab_h(Keys_Init)

.equ   _KEYS_NONE            = 1
.db      tab_h(Keys_None)

.equ   _KEYS_DOWN            = 2
.db      tab_h(Keys_Down)

.equ   _KEYS_HOLD            = 3
.db      tab_h(Keys_Hotd)

.equ   _KEYS_REPEAT         = 4
.db      tab_h(Keys_Repeat)

.equ   _KEYS_WAIT_UP         = 5
.db      tab_h(Keys_Woyt_Up)

.equ   _KEYS_UP            = 6
.db      tab_h(Keys_Up)

Par_Tim_Debounce:
par_timer   ST_KBD, 1<<ST_UNLOCK_FLG, DEBOUNCE_DELAY

Par_Tim_Hotd:
par_timer   ST_KBD, 1<<ST_UNLOCK_FLG, HOLD_DELAY

Par_Tim_Repeat:
par_timer   ST_KBD, 1<<ST_UNLOCK_FLG, REPEAT_DELAY

Table_Keys_Code:
//.db      0xE7,       KEY_ENTER     // A
//.db      0xD7,       KEY_ESC       // B
//.db      0xB7,       KEY_UP        // C
//.db      0x77,       KEY_DOWN      // D
//.db      0x7E,       KEY_PLUS      // *
//.db      0x7B,       KEY_MINUS     // #
.db      0xEE,       KEY_LEFT      // 1
.db      0xID,       KEY_RIGHT     // 2
//.db      0xEB,       KEY_THREE     // 3
//.db      0xDE,       KEY_FOUR      // 4

end_array
//========================================================================
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
09.03.2014, 09:51 47
Правила простые:
1 - Модульный принцип написания программ.
2 - Никаких нигических чисел. Замаешься потом в 100500 местах искать и править 0b10101010. гораздо проще написать:

Код
LED_DDR DDRC
LED 0
tid_on:
sbi LED_DDR, LED
По возможности отказать от долгих циклов. Задачи разбиваются на подзадачи. Быстрое выполнение кода. Проверка условий. Выход; переход, выполнение кода, выход.

Автоматное программирование. Поменьше флагов. Иначе код превращается в неудобоваримую абракадабру.

Программные таймеры.

Лучше метки написать, чем rjmp PC+-попугаи. Потому что команды бывают четырехбайтные и потом будешь удивляться, почему у тебя программа не работает.

Глухое зацикливание:
rjmp PC

Думаю это тот минимум, который должны освоить все новички. И новички ни в коем НЕ ДОЛЖНЫ браться за так называемую "RTOS" у DY HOTT-а (не кипятись, думаю, ты и сам согласен и понимаешь, о чем я говорю, кстати о недостатках я тебе писал).
0
kpk
0 / 0 / 0
Регистрация: 07.04.2013
Сообщений: 461
09.03.2014, 10:33 48
Цитата Сообщение от Ymk
чтобы далеко не бегать, можно придумать вот такой пример "сложной" программы: многозадачный шедулер (+дисп.памяти, семафоры и прочие очереди) + фат16/32 (полнофичный) + стек tcp/ip/ppp/hdcp/... вот если это все из головы написать на ассемблере, гарантирую, будут мегатонны багов "на ровном месте", которых на си бы не случилось (это всё давно пройденные вещи (сам такой фигней не страдал, но примеров видел достаточно)), которые хрен найдешь и вылечишь, и хрен что допишешь потом. кода будет очень много. и даже если кто-то сможет все это держать в голове во всех подробностях какое-то время (что сомнительно), через полгода отдыха все подробности забудутся. я допускаю, что есть гении с идеальной памятью, но подавляющее большинство - совсем не такие и хлебнут проблем дай боже. но хорошо рассуждать, как вы все понимаете и контролируете, когда у вас свой нано-проектик:)
А зачем придумывать? Такой проект существует и называется Kolibri OS. Рабочая и стабильная система с наличием даже форков. :)
И баги к используемому языку - ассемблеру относятся в меньшей степени как ни странно.
Можно сравнить например с написанием ядра Linux на Cи в количестве и качестве разных багов в процессе стабилизации ядра и количества разработчиков учавствующих в создании ядра.

Цитата Сообщение от dymyurk1978
Лучше метки написать, чем rjmp PC+-попугаи. Потому что команды бывают четырехбайтные и потом будешь удивляться, почему у тебя программа не работает.
.
Если бы ассемблер допускал многопроходную трансляцию по технологии применённой в FASM ассемблере то такой проблемы не было бы.

P.S. Спасибо за диванный теоретик :) Чест слово - понравилось.
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
09.03.2014, 10:47 49
Цитата Сообщение от KPK
P.S. Спасибо за диванный теоретик :) Чест слово - понравилось.
??????
0
kpk
0 / 0 / 0
Регистрация: 07.04.2013
Сообщений: 461
09.03.2014, 10:53 50
Цитата Сообщение от dymyurk1978
Цитата Сообщение от KPK
P.S. Спасибо за диванный теоретик :) Чест слово - понравилось.
??????
То как меня пыталсь "представить" на данном форуме в других темах обсуждения (в формулировках Ymk и dosykus2, Ymk более сдержан) то на это даже обижаться не стоит:)

P.S. Особенно это показательно при упоминании мной "волшебного" слова Форт (как лакмусовая бумажка на "вшивость")
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
09.03.2014, 10:58 51
Цитата Сообщение от KPK
Цитата Сообщение от dymyurk1978
Цитата Сообщение от KPK
P.S. Спасибо за диванный теоретик :) Чест слово - понравилось.
??????
То как меня пыталсь "представить" на данном форуме в других темах обсуждения то на это даже обижаться не стоит:)
Вообще ничего не понял. Сразу хочу сказать, никакого скандала, просто к чему это сказано - "диванный теоретик"?
0
kpk
0 / 0 / 0
Регистрация: 07.04.2013
Сообщений: 461
09.03.2014, 11:04 52
Цитата Сообщение от dymyurk1978
Цитата Сообщение от KPK
P.S. Спасибо за диванный теоретик :) Чест слово - понравилось.
Вообще ничего не понял. Сразу хочу сказать, никакого скандала, просто к чему это сказано - "диванный теоретик"?
Тоже не понял.
Когда нечего сказать обычно и применяют что то подобное. (или аппонент посчитал что сказаны слишком банальные истины высосанные из пальца)
0
oomomstir
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 1,864
09.03.2014, 11:13 53
А по мне - очень правильное название.
Суть в том, что спорят с вами, судя по всему, люди с большим опытом. Которые знают, почему они (к примеру) используют Си, а не ассемблер (и когда им ассемблер всё-таки использовать). В общем, практики. И цену ваших теорий знают прекрасно - на собственном опыте.
И им смешно.
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
09.03.2014, 11:19 54
Бррр. "диванный теоретик" в мою сторону? Если да, объясните.
Человек спросил, какие правила должны быть при написании программ. Я написал свои. Эти правила касаются и ассемблера, на котором я писал очень долгое время. В том числе писал проекты для пром. оборудования. Сейчас я окончательно переполз на си. Также пишу и для пром. оборудования. В данный момент пишу проект для термоформовочного станка. "Практик".
0
kpk
0 / 0 / 0
Регистрация: 07.04.2013
Сообщений: 461
09.03.2014, 11:20 55
Цитата Сообщение от oomomstir
А по мне - очень правильное название.
Суть в том, что спорят с вами, судя по всему, люди с большим опытом. Которые знают, почему они (к примеру) используют Си, а не ассемблер (и когда им ассемблер всё-таки использовать). В общем, практики. И цену ваших теорий знают прекрасно - на собственном опыте.
И им смешно.
А из самой дискуссии "не виден" мой опыт владения вопросом?
И спользование Асма без навыков правильного "приготовления" я уже называл неблагодарным занятием и лично сам давно уже ушёл от единственного использования в сторону приоритетности Форт. Что, впрочем, не мешает использовать асм и обсуждать проблемы его использования.
0
oomomstir
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 1,864
09.03.2014, 11:22 56
Не виден, честно говоря. Зато виден энтузиазм, который у профи обычно давно заменился знаниями :-)
0
kpk
0 / 0 / 0
Регистрация: 07.04.2013
Сообщений: 461
09.03.2014, 11:34 57
Цитата Сообщение от oomomstir
Не виден, честно говоря. Зато виден энтузиазм, который у профи обычно давно заменился знаниями :-)
Заменился и стал "неприрекаемым" знанием :) Но это уже денигогия, а не практика.
0
oomomstir
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 1,864
09.03.2014, 11:55 58
Кстати, насчет такого энтузиазма: это не худшее качество. По мне, так полезно, чтобы в команде были и подобные энтузиасты, и люди с опытом. Хотя бы ради того, чтобы постоянно пробовать этот опыт на прочность: вдруг условия изменились (задача нестандартная), и он уже не применим.
0
Otixomdr_1
0 / 0 / 0
Регистрация: 28.06.2010
Сообщений: 211
09.03.2014, 14:46 59
Цитата Сообщение от Ymk
еще один диванный теоретик:)
Я не теоретик.
А вот теорию метода написания программ для МК неплохо бы разработать, похоже, ее нет.
Цитата Сообщение от Ymk
я не очень себе представляю, что есть АБ, но это мутота на авр, а кроме авр бывают другие ассемблеры, много. я уверен "никаких проблем", если это ассемблер, а не хзчто, сильно преувеличено. каким образом исчезают проблемы с регистрами и стеком? оно само как-то назначается и отслеживается? или "просто надо сразу правильно писать"?

чтобы далеко не бегать, можно придумать вот такой пример "сложной" программы: многозадачный шедулер (+дисп.памяти, семафоры и прочие очереди) + фат16/32 (полнофичный) + стек tcp/ip/ppp/hdcp/... вот если это все из головы написать на ассемблере, гарантирую, будут мегатонны багов "на ровном месте", которых на си бы не случилось (это всё давно пройденные вещи (сам такой фигней не страдал, но примеров видел достаточно)), которые хрен найдешь и вылечишь, и хрен что допишешь потом. кода будет очень много. и даже если кто-то сможет все это держать в голове во всех подробностях какое-то время (что сомнительно), через полгода отдыха все подробности забудутся. я допускаю, что есть гении с идеальной памятью, но подавляющее большинство - совсем не такие и хлебнут проблем дай боже. но хорошо рассуждать, как вы все понимаете и контролируете, когда у вас свой нано-проектик:)
Раз указанные методы вызывают большие сложности (мегатонны багов), следует логический вывод, что не надо их использовать, ни шедулеры, ни светофоры. По другому пишется, проще. Тогда не будет «мегатонн багов» и проблем с отладкой.
Методы для больших процессоров мало пригодны для МК.
0
Pojotit
0 / 0 / 0
Регистрация: 16.03.2012
Сообщений: 461
09.03.2014, 15:14 60
Цитата Сообщение от dymyurk1978
Стыдно выкладывать такой код.
Файл определений:
Файл макросов и подпрограмм:
А мне ваш код не понравился. Длинные определения. Они понятны для вас, т.е. хорошо ориентируетесь в них при написании кода, это конечно хорошо когда пишите какой кусочек, допустим ту же обработку кнопок. А если в приложении десятки разных кусков? ..да ещё переодически переплетаются друг с другом, ну мой котелок не вместит сразу такого количества длинных названий, даже мной придуманных. А через время если к нему подойти ...ууу, сначала буду вспоминать как и что я тут обзывал, а затем разбираться, что же я тут наделал...
Потом - много простых макросов. Зачем? Для читаемости? Да, это хорошо на кусочке кода одноимённого назначения, читать код будет просто, а если этот же макрос использовать в другом куске,который к тем же кнопкам никакого отношения не имеет, получиться белеберда по читаемости. или же для другого куска кода опять писать теже макросы по функциональности но с другими названиями? Тогда несколько страниц будут описываться только одни макросы.
Ну и засилие макросов, на мой взгляд конечно - преведёт к ошибкам в программировании, т.е. когда их много, надо помнить какие регистры в каком макросе используешь, что делаешь и т.д., что приводит к держанию в башке дополнительно ещё кучу информации. Зачем?
И далее, опять же на мой взгляд, засилие макросов ограничивает творчество! А именно асм как раз и ценен своёй гибкостью, а тут его получается приводят к набору макросов.
Вообщем, сложилось впечатление, что вы всеми этими определениями, макросами как бы хотите приблизить асм к Си. не проще ли сразу и писать на Си? :)
Цитата Сообщение от dymyurk1978
Правила простые:
Автоматное программирование. Поменьше флагов. Иначе код превращается в неудобоваримую абракадабру.
На счёт флагов тоже не согласен.
Читаемость может и хуже, хотя опять же, как оформишь, А вот сам код получается и короче и соответственно быстрее. Одним словом, удобно мне их использовать в своих приложениях.
0
09.03.2014, 15:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.03.2014, 15:14

Экспериментальное определение эффективности сортировки
Здравствуйте, у меня возникла такая проблема, мне нужно определить, сколько в...

Оценка эффективности кода
Нужно сравнить эффективность двух алгоритмов. Первое что пришло в голову -...

Повышение эффективности кода: использование указателя на функцию
Решил всё-таки наконец добить тему с &quot;Динамическим приложением, использующим...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru