AVR+Embedded Нужен совет специалистов

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

AVR+Embedded Нужен совет специалистов

Сообщение OnOff » 25.05.2021 16:31:02

Первоначально, стек TCP/IP и приложение с его использованием был разработан для процессоров типа x86(R8820) на языке Turbo pascal 7.0, но со временем пришлось переходить на другую аппаратную базу. Для решения задачи был выбран компилятор FreePascal, с его возможностями кросс компиляции. Так как он предлагал совместимость с продуктом Borland. Микроконтроллер ATMEGA1284p имеет достаточно ресурсов для решения задачи, так имеет 128 килобайт flash память и 16 килобайт RAM. Сборка простых программ показал, что компилятор создаёт стабильный код. Так при сборке пакетного драйвера на основе enc28j60 в режиме SPI проблем не возникло. Тестовый пример показал устойчивую работу. Пакеты принимались и отправлялись. Я уже решил, что задача практически решена, так как поддержка аппаратного уровня произведена успешно. Но подключение TCP стека вызвала много головной боли. Как в совместимости с прежним компилятором так и в ошибках в нем.
Но обовсём по порядку.
1) В препрессоре не работают конструкции

Файл: global.inc(образец)
{$ifdef icpdas}
{ $E+ $N- $G- $I- $L- $D-}
{$i icpdas.inc}
{$else}
{$define dpmi}
{$i pc.inc}
{$endif}

Вложение нескольких include похоже больше не работают, так как define в них объявленные, к сожалению, теряются. Несколько вложенных {$ifdef XXX} вызывают у препрессора проблемы.

2) Работа с динамической памятью вызывает некоторые проблемы. В unit(ах) в секции инициализации нельзя выделять память без указания в этом модуле(uses heapmgr)
так как вызов GetMem осуществляется без менеджера памяти, что приводит к краху программы. На мой вкус, если в программе в принципе встречаются функции работы с динамической памятью, то модуль heapmgr должен быть вызван первым в списке инициализации модулей программы.

Код: Выделить всё
00000234 <FPC_INIT_FUNC_TABLE>:
     234:   0e 94 9a 35    call   0x6b34   ; 0x6b34 <MSTIMER_ss_inits>
     238:   0e 94 98 3c    call   0x7930   ; 0x7930 <HEAPMGR_ss_inits>
     23c:   0e 94 5e 34    call   0x68bc   ; 0x68bc <SOCKETS_ss_inits>
     240:   0e 94 16 53    call   0xa62c   ; 0xa62c <UDP_ss_inits>
     244:   0e 94 04 6f    call   0xde08   ; 0xde08 <TCP_ss_inits>
     248:   0e 94 8a 6f    call   0xdf14   ; 0xdf14 <DNS_ss_inits>
     24c:   0e 94 93 43    call   0x8726   ; 0x8726 <ARP_ss_inits>
     250:   0e 94 c1 2f    call   0x5f82   ; 0x5f82 <IP_ss_inits>
     254:   0e 94 9e 18    call   0x313c   ; 0x313c <NETWORK_ss_inits>
     258:   08 95          ret


Очень не хватает функции возвращающей размер свободной памяти.
Текущий порядок инициализации модулей:

3) При компиляции(даже без оптимизации) возникают внутренние ошибки типа 2017091103. Ругань на код абсолютно чистый и проверенный Borland.

Пример:
Код: Выделить всё
    ($ifdef dontfragment}
    if more_fragment or (FragmentOffset <> 0)
     then begin
      { - Treatment of fragmented IP datagrams - }
      IP_CheckDatagrams();
      IP_ProcessFragment(last_packet^.Id, last_packet^.Protocol, last_packet^.SourceIP,
                         last_packet^.TargetIP, PData^, DataLen, FragmentOffset, not more_fragment);
      IP_CheckDatagrams();
     end else {$endif}
     IP_ProcessDatagram(last_packet^.Protocol, last_packet^.SourceIP, last_packet^.TargetIP, PData^, DataLen);


Пришлось отрезать обработчик фрагментированных пакетов и ошибка пропала. Чистка и пересборка тут не помогают.
4) Теперь о самом неприятном. Когда программа собралась и не вроде как работает то вроде как счастье, код то был отлажен и... Ничего не работает.
Нормального отладчика нет. Только серийный порт и светодиоды на борде. Вобщем нашел проблему которую и не ожидал. Это оказалась передача параметров в процедуру. Передаешь одни параметры, получаешь внутри другие. Изначально было так :

Код: Выделить всё
  list := ProtocolList;
  while list <> nil
   do begin
    PE := List^.data;
    if (PE^.Adapter = Adapter) and (PE^.ProtocolType = ARPPacket^.ProtocolType)
     then begin
      PE^.Routine(Adapter, Packet.Header.SourceAddr, ARPPacket^.Operation, ARPPacket^.PLEN,
                  ARPPacket^.ARPData.SenderMAC, ARPPacket^.ARPData.SenderIP,
                  ARPPacket^.ARPData.TargetMAC, ARPPacket^.ARPData.TargetIP);
     end;
    list := list^.next;
   end;


Внутри процедуры обнаруживаешь искажённую ARPPacket^.ARPData.TargetIP. Значение произвольное, оно меняется при изменении кода с последующей перекомпиляцией. Ладно. Может не нравится динамический вызов процедуры из структуры и переписал. Вместо переменных с IP адресом вставил константы.

Код: Выделить всё
if typeLEN_IP = ARPPacket^.ProtocolType
  then begin
   ProcessARP(Adapter, Packet.Header.SourceAddr, ARPPacket^.Operation, ARPPacket^.PLEN,
              ARPPacket^.ARPData.SenderMAC, $590AA8C0 {ARPPacket^.ARPData.SenderIP},
              ARPPacket^.ARPData.TargetMAC, $590AA8C0 {ARPPacket^.ARPData.TargetIP});
  end;


Собственно процедура:

Код: Выделить всё
procedure ProcessARP(Adapter : PNetworkAdapter; const SourceEtherAddr : TMACAddress; Operation : word; PLEN: byte;
          const SenderHA : TMACAddress; SenderPA: TIPAddress;
          const TargetHA : TMACAddress; TargetPA: TIPAddress);
begin
  writeln('After sender : '+ MACToStr(SenderHA)+ ' ('+ inet_ntoa(SenderPA)+ ') '+ hexl(SenderPA));
  writeln('After target : '+ MACToStr(TargetHA)+ ' ('+ inet_ntoa(TargetPA)+ ') '+ hexl(TargetPA));
  ...


Результат :

Setting for adapter : ENC28J60
MAC : 01:02:03:04:05:06
IP Address : 192.168.10.35
Network mask: 255.255.255.0
Gateway : 192.168.10.1
DNS : 8.8.8.8
Destination Mask Gateway IP Local Charge
--------------- --------------- --------------- --------------- -----
127.0.0.0 255.0.0.0 127.0.0.1 127.0.0.1 0
192.168.10.35 255.255.255.255 127.0.0.1 127.0.0.1 0
192.168.10.0 255.255.255.0 192.168.10.35 192.168.10.35 0
0.0.0.0 0.0.0.0 192.168.10.1 192.168.10.35 9999

After sender : E0:D5:5E:C3:52:30 (192.168.10.89) 590AA8C0
After target : 00:00:00:00:00:00 (0.0.0.10) 0A000000

Теперь это можно дизасемблить.

Вызов процедуры :

Код: Выделить всё
   ProcessARP(Adapter, Packet.Header.SourceAddr, ARPPacket^.Operation, ARPPacket^.PLEN,
    7fcc:   a0 ec          ldi   r26, 0xC0   ; 192
    7fce:   2a 2f          mov   r18, r26
    7fd0:   a8 ea          ldi   r26, 0xA8   ; 168
    7fd2:   3a 2f          mov   r19, r26
    7fd4:   aa e0          ldi   r26, 0x0A   ; 10
    7fd6:   4a 2f          mov   r20, r26
    7fd8:   a9 e5          ldi   r26, 0x59   ; 89
    7fda:   5a 2f          mov   r21, r26
    7fdc:   ed 2d          mov   r30, r13
    7fde:   fe 2d          mov   r31, r14
    7fe0:   20 83          st   Z, r18
    7fe2:   31 83          std   Z+1, r19   ; 0x01
    7fe4:   42 83          std   Z+2, r20   ; 0x02
    7fe6:   53 83          std   Z+3, r21   ; 0x03
    7fe8:   2a 85          ldd   r18, Y+10   ; 0x0a
    7fea:   3b 85          ldd   r19, Y+11   ; 0x0b
    7fec:   e2 2f          mov   r30, r18
    7fee:   f3 2f          mov   r31, r19
    7ff0:   25 81          ldd   r18, Z+5   ; 0x05
    7ff2:   3a 85          ldd   r19, Y+10   ; 0x0a
    7ff4:   5b 85          ldd   r21, Y+11   ; 0x0b
    7ff6:   e3 2f          mov   r30, r19
    7ff8:   f5 2f          mov   r31, r21
    7ffa:   46 81          ldd   r20, Z+6   ; 0x06
    7ffc:   e3 2f          mov   r30, r19
    7ffe:   f5 2f          mov   r31, r21
    8000:   57 81          ldd   r21, Z+7   ; 0x07
              ARPPacket^.ARPData.SenderMAC, $590AA8C0 {ARPPacket^.ARPData.SenderIP},
              ARPPacket^.ARPData.TargetMAC, $590AA8C0 {ARPPacket^.ARPData.TargetIP});
    8002:   7a 85          ldd   r23, Y+10   ; 0x0a
    8004:   8b 85          ldd   r24, Y+11   ; 0x0b
   ProcessARP(Adapter, Packet.Header.SourceAddr, ARPPacket^.Operation, ARPPacket^.PLEN,
    8006:   62 e1          ldi   r22, 0x12   ; 18
    8008:   30 e0          ldi   r19, 0x00   ; 0
    800a:   67 0f          add   r22, r23
    800c:   38 1f          adc   r19, r24
    800e:   a6 2e          mov   r10, r22
    8010:   b3 2e          mov   r11, r19
              ARPPacket^.ARPData.SenderMAC, $590AA8C0{ARPPacket^.ARPData.SenderIP},
    8012:   3a 85          ldd   r19, Y+10   ; 0x0a
    8014:   6b 85          ldd   r22, Y+11   ; 0x0b
   ProcessARP(Adapter, Packet.Header.SourceAddr, ARPPacket^.Operation, ARPPacket^.PLEN,
    8016:   08 e0          ldi   r16, 0x08   ; 8
    8018:   10 e0          ldi   r17, 0x00   ; 0
    801a:   03 0f          add   r16, r19
    801c:   16 1f          adc   r17, r22
    801e:   38 85          ldd   r19, Y+8   ; 0x08
    8020:   89 85          ldd   r24, Y+9   ; 0x09
    8022:   66 e0          ldi   r22, 0x06   ; 6
    8024:   70 e0          ldi   r23, 0x00   ; 0
    8026:   63 0f          add   r22, r19
    8028:   78 1f          adc   r23, r24
    802a:   8e 81          ldd   r24, Y+6   ; 0x06
    802c:   9f 81          ldd   r25, Y+7   ; 0x07
    802e:   a0 ec          ldi   r26, 0xC0   ; 192
    8030:   ca 2e          mov   r12, r26
    8032:   a8 ea          ldi   r26, 0xA8   ; 168
    8034:   da 2e          mov   r13, r26
    8036:   aa e0          ldi   r26, 0x0A   ; 10
    8038:   ea 2e          mov   r14, r26
    803a:   a9 e5          ldi   r26, 0x59   ; 89
    803c:   fa 2e          mov   r15, r26
    803e:   0e 94 8d 3d    call   0x7b1a   ; 0x7b1a <ARP_ss_PROCESSARPscrcEB739556>
    ...


Процедура :
Код: Выделить всё
00007b1a <ARP_ss_PROCESSARPscrcEB739556>:
procedure ProcessARP(Adapter : PNetworkAdapter; const SourceEtherAddr : TMACAddress; Operation : word; PLEN: byte;
          const SenderHA : TMACAddress; SenderPA: TIPAddress;
          const TargetHA : TMACAddress; TargetPA: TIPAddress);
begin
    7b1a:   df 93          push   r29
    7b1c:   cf 93          push   r28
    7b1e:   1f 93          push   r17
    7b20:   0f 93          push   r16
    7b22:   ff 92          push   r15
    7b24:   ef 92          push   r14
    7b26:   df 92          push   r13
    7b28:   cf 92          push   r12
    7b2a:   bf 92          push   r11
    7b2c:   af 92          push   r10
    7b2e:   9f 92          push   r9
    7b30:   8f 92          push   r8
    7b32:   cd b7          in   r28, 0x3d   ; 61
    7b34:   de b7          in   r29, 0x3e   ; 62
    7b36:   c2 53          subi   r28, 0x32   ; 50
    7b38:   d4 40          sbci   r29, 0x04   ; 4
    7b3a:   0f b6          in   r0, 0x3f   ; 63
    7b3c:   f8 94          cli
    7b3e:   de bf          out   0x3e, r29   ; 62
    7b40:   0f be          out   0x3f, r0   ; 63
    7b42:   cd bf          out   0x3d, r28   ; 61
    7b44:   8e 83          std   Y+6, r24   ; 0x06
    7b46:   9f 83          std   Y+7, r25   ; 0x07
    7b48:   68 87          std   Y+8, r22   ; 0x08
    7b4a:   79 87          std   Y+9, r23   ; 0x09
    7b4c:   4a 87          std   Y+10, r20   ; 0x0a
    7b4e:   5b 87          std   Y+11, r21   ; 0x0b
    7b50:   2c 87          std   Y+12, r18   ; 0x0c
    7b52:   0d 87          std   Y+13, r16   ; 0x0d
    7b54:   1e 87          std   Y+14, r17   ; 0x0e
    7b56:   cf 86          std   Y+15, r12   ; 0x0f
    7b58:   d8 8a          std   Y+16, r13   ; 0x10
    7b5a:   e9 8a          std   Y+17, r14   ; 0x11
    7b5c:   fa 8a          std   Y+18, r15   ; 0x12
    7b5e:   ab 8a          std   Y+19, r10   ; 0x13
    7b60:   bc 8a          std   Y+20, r11   ; 0x14
    7b62:   0a 80          ldd   r0, Y+2   ; 0x02
    7b64:   0d 8a          std   Y+21, r0   ; 0x15
    7b66:   0b 80          ldd   r0, Y+3   ; 0x03
    7b68:   0e 8a          std   Y+22, r0   ; 0x16
    7b6a:   0c 80          ldd   r0, Y+4   ; 0x04
    7b6c:   0f 8a          std   Y+23, r0   ; 0x17
    7b6e:   0d 80          ldd   r0, Y+5   ; 0x05
    7b70:   08 8e          std   Y+24, r0   ; 0x18
  writeln('After sender : '+ MACToStr(SenderHA)+ ' ('+ inet_ntoa(SenderPA)+ ') '+ hexl(SenderPA));
    7b72:   2b e2          ldi   r18, 0x2B   ; 43
    7b74:   34 e0          ldi   r19, 0x04   ; 4
    7b76:   e9 e1          ldi   r30, 0x19   ; 25
    7b78:   f1 e0          ldi   r31, 0x01   ; 1
    7b7a:   ec 0f          add   r30, r28
    7b7c:   fd 1f          adc   r31, r29
    7b7e:   21 93          st   Z+, r18
    7b80:   30 83          st   Z, r19
    7b82:   6d 85          ldd   r22, Y+13   ; 0x0d
    7b84:   7e 85          ldd   r23, Y+14   ; 0x0e
    7b86:   85 e2          ldi   r24, 0x25   ; 37
    7b88:   91 e0          ldi   r25, 0x01   ; 1
    7b8a:   8c 0f          add   r24, r28
    7b8c:   9d 1f          adc   r25, r29
    7b8e:   0e 94 a7 14    call   0x294e   ; 0x294e <NETWORK_ss_MACTOSTRsTMACADDRESSssSHORTSTRING>
    7b92:   25 e2          ldi   r18, 0x25   ; 37
    7b94:   31 e0          ldi   r19, 0x01   ; 1
    7b96:   2c 0f          add   r18, r28
    7b98:   3d 1f          adc   r19, r29
    7b9a:   eb e1          ldi   r30, 0x1B   ; 27
    7b9c:   f1 e0          ldi   r31, 0x01   ; 1
    7b9e:   ec 0f          add   r30, r28
    7ba0:   fd 1f          adc   r31, r29
    7ba2:   21 93          st   Z+, r18
    7ba4:   30 83          st   Z, r19
    7ba6:   3c e3          ldi   r19, 0x3C   ; 60
    7ba8:   24 e0          ldi   r18, 0x04   ; 4
    7baa:   ed e1          ldi   r30, 0x1D   ; 29
    7bac:   f1 e0          ldi   r31, 0x01   ; 1
    7bae:   ec 0f          add   r30, r28
    7bb0:   fd 1f          adc   r31, r29
    7bb2:   31 93          st   Z+, r19
    7bb4:   20 83          st   Z, r18
    7bb6:   4f 85          ldd   r20, Y+15   ; 0x0f
    7bb8:   58 89          ldd   r21, Y+16   ; 0x10
    7bba:   69 89          ldd   r22, Y+17   ; 0x11
    7bbc:   7a 89          ldd   r23, Y+18   ; 0x12
    7bbe:   85 e2          ldi   r24, 0x25   ; 37
    7bc0:   92 e0          ldi   r25, 0x02   ; 2
    7bc2:   8c 0f          add   r24, r28
    7bc4:   9d 1f          adc   r25, r29
    7bc6:   0e 94 46 33    call   0x668c   ; 0x668c <SOCKETS_ss_INET_NTOAsLONGWORDssSHORTSTRING>
    7bca:   25 e2          ldi   r18, 0x25   ; 37
    7bcc:   32 e0          ldi   r19, 0x02   ; 2
    7bce:   2c 0f          add   r18, r28
    7bd0:   3d 1f          adc   r19, r29
    7bd2:   ef e1          ldi   r30, 0x1F   ; 31
    7bd4:   f1 e0          ldi   r31, 0x01   ; 1
    7bd6:   ec 0f          add   r30, r28
    7bd8:   fd 1f          adc   r31, r29
    7bda:   21 93          st   Z+, r18
    7bdc:   30 83          st   Z, r19
    7bde:   20 e4          ldi   r18, 0x40   ; 64
    7be0:   34 e0          ldi   r19, 0x04   ; 4
    7be2:   e1 e2          ldi   r30, 0x21   ; 33
    7be4:   f1 e0          ldi   r31, 0x01   ; 1
    7be6:   ec 0f          add   r30, r28
    7be8:   fd 1f          adc   r31, r29
    7bea:   21 93          st   Z+, r18
    7bec:   30 83          st   Z, r19
    7bee:   4f 85          ldd   r20, Y+15   ; 0x0f
    7bf0:   58 89          ldd   r21, Y+16   ; 0x10
    7bf2:   69 89          ldd   r22, Y+17   ; 0x11
    7bf4:   7a 89          ldd   r23, Y+18   ; 0x12
    7bf6:   85 e2          ldi   r24, 0x25   ; 37
    7bf8:   94 e0          ldi   r25, 0x04   ; 4
    7bfa:   8c 0f          add   r24, r28
    7bfc:   9d 1f          adc   r25, r29
    7bfe:   0e 94 cf 37    call   0x6f9e   ; 0x6f9e <HEX_ss_HEXLsLONGINTssSTRING8>
    7c02:   45 e2          ldi   r20, 0x25   ; 37
    7c04:   54 e0          ldi   r21, 0x04   ; 4
    7c06:   4c 0f          add   r20, r28
    7c08:   5d 1f          adc   r21, r29
    7c0a:   af ef          ldi   r26, 0xFF   ; 255
    7c0c:   6a 2f          mov   r22, r26
    7c0e:   71 2d          mov   r23, r1
    7c10:   85 e2          ldi   r24, 0x25   ; 37
    7c12:   93 e0          ldi   r25, 0x03   ; 3
    7c14:   8c 0f          add   r24, r28
    7c16:   9d 1f          adc   r25, r29
    7c18:   0e 94 89 02    call   0x512   ; 0x512 <fpc_shortstr_to_shortstr>
    7c1c:   25 e2          ldi   r18, 0x25   ; 37
    7c1e:   33 e0          ldi   r19, 0x03   ; 3
    7c20:   2c 0f          add   r18, r28
    7c22:   3d 1f          adc   r19, r29
    7c24:   e3 e2          ldi   r30, 0x23   ; 35
    7c26:   f1 e0          ldi   r31, 0x01   ; 1
    7c28:   ec 0f          add   r30, r28
    7c2a:   fd 1f          adc   r31, r29
    7c2c:   21 93          st   Z+, r18
    7c2e:   30 83          st   Z, r19
    7c30:   49 e1          ldi   r20, 0x19   ; 25
    7c32:   51 e0          ldi   r21, 0x01   ; 1
    7c34:   4c 0f          add   r20, r28
    7c36:   5d 1f          adc   r21, r29
    7c38:   a5 e0          ldi   r26, 0x05   ; 5
    7c3a:   2a 2f          mov   r18, r26
    7c3c:   31 2d          mov   r19, r1
    7c3e:   af ef          ldi   r26, 0xFF   ; 255
    7c40:   6a 2f          mov   r22, r26
    7c42:   71 2d          mov   r23, r1
    7c44:   89 e1          ldi   r24, 0x19   ; 25
    7c46:   90 e0          ldi   r25, 0x00   ; 0
    7c48:   8c 0f          add   r24, r28
    7c4a:   9d 1f          adc   r25, r29
    7c4c:   0e 94 9c 03    call   0x738   ; 0x738 <fpc_shortstr_concat_multi>
    7c50:   89 e1          ldi   r24, 0x19   ; 25
    7c52:   90 e0          ldi   r25, 0x00   ; 0
    7c54:   8c 0f          add   r24, r28
    7c56:   9d 1f          adc   r25, r29
    7c58:   0e 94 1f 14    call   0x283e   ; 0x283e <UFP_UARTSERIAL_ss_WRITELNsSHORTSTRING>
  writeln('After target : '+ MACToStr(TargetHA)+ ' ('+ inet_ntoa(TargetPA)+ ') '+ hexl(TargetPA));
    7c5c:   34 e4          ldi   r19, 0x44   ; 68
    7c5e:   24 e0          ldi   r18, 0x04   ; 4
    7c60:   e9 e1          ldi   r30, 0x19   ; 25
    7c62:   f1 e0          ldi   r31, 0x01   ; 1
    7c64:   ec 0f          add   r30, r28
    7c66:   fd 1f          adc   r31, r29
    7c68:   31 93          st   Z+, r19
    7c6a:   20 83          st   Z, r18
    7c6c:   6b 89          ldd   r22, Y+19   ; 0x13
    7c6e:   7c 89          ldd   r23, Y+20   ; 0x14
    7c70:   85 e2          ldi   r24, 0x25   ; 37
    7c72:   91 e0          ldi   r25, 0x01   ; 1
    7c74:   8c 0f          add   r24, r28
    7c76:   9d 1f          adc   r25, r29
    7c78:   0e 94 a7 14    call   0x294e   ; 0x294e <NETWORK_ss_MACTOSTRsTMACADDRESSssSHORTSTRING>
    7c7c:   25 e2          ldi   r18, 0x25   ; 37
    7c7e:   31 e0          ldi   r19, 0x01   ; 1
    7c80:   2c 0f          add   r18, r28
    7c82:   3d 1f          adc   r19, r29
    7c84:   eb e1          ldi   r30, 0x1B   ; 27
    7c86:   f1 e0          ldi   r31, 0x01   ; 1
    7c88:   ec 0f          add   r30, r28
    7c8a:   fd 1f          adc   r31, r29
    7c8c:   21 93          st   Z+, r18
    7c8e:   30 83          st   Z, r19
    7c90:   2c e3          ldi   r18, 0x3C   ; 60
    7c92:   34 e0          ldi   r19, 0x04   ; 4
    7c94:   ed e1          ldi   r30, 0x1D   ; 29
    7c96:   f1 e0          ldi   r31, 0x01   ; 1
    7c98:   ec 0f          add   r30, r28
    7c9a:   fd 1f          adc   r31, r29
    7c9c:   21 93          st   Z+, r18
    7c9e:   30 83          st   Z, r19
    7ca0:   4d 89          ldd   r20, Y+21   ; 0x15
    7ca2:   5e 89          ldd   r21, Y+22   ; 0x16
    7ca4:   6f 89          ldd   r22, Y+23   ; 0x17
    7ca6:   78 8d          ldd   r23, Y+24   ; 0x18
    7ca8:   85 e2          ldi   r24, 0x25   ; 37
    7caa:   92 e0          ldi   r25, 0x02   ; 2
    7cac:   8c 0f          add   r24, r28
    7cae:   9d 1f          adc   r25, r29
    7cb0:   0e 94 46 33    call   0x668c   ; 0x668c <SOCKETS_ss_INET_NTOAsLONGWORDssSHORTSTRING>
    7cb4:   25 e2          ldi   r18, 0x25   ; 37
    7cb6:   32 e0          ldi   r19, 0x02   ; 2
    7cb8:   2c 0f          add   r18, r28
    7cba:   3d 1f          adc   r19, r29
    7cbc:   ef e1          ldi   r30, 0x1F   ; 31
    7cbe:   f1 e0          ldi   r31, 0x01   ; 1
    7cc0:   ec 0f          add   r30, r28
    7cc2:   fd 1f          adc   r31, r29
    7cc4:   21 93          st   Z+, r18
    7cc6:   30 83          st   Z, r19
    7cc8:   20 e4          ldi   r18, 0x40   ; 64
    7cca:   34 e0          ldi   r19, 0x04   ; 4
    7ccc:   e1 e2          ldi   r30, 0x21   ; 33
    7cce:   f1 e0          ldi   r31, 0x01   ; 1
    7cd0:   ec 0f          add   r30, r28
    7cd2:   fd 1f          adc   r31, r29
    7cd4:   21 93          st   Z+, r18
    7cd6:   30 83          st   Z, r19
    7cd8:   4d 89          ldd   r20, Y+21   ; 0x15
    7cda:   5e 89          ldd   r21, Y+22   ; 0x16
    7cdc:   6f 89          ldd   r22, Y+23   ; 0x17
    7cde:   78 8d          ldd   r23, Y+24   ; 0x18
    7ce0:   85 e2          ldi   r24, 0x25   ; 37
    7ce2:   94 e0          ldi   r25, 0x04   ; 4
    7ce4:   8c 0f          add   r24, r28
    7ce6:   9d 1f          adc   r25, r29
    7ce8:   0e 94 cf 37    call   0x6f9e   ; 0x6f9e <HEX_ss_HEXLsLONGINTssSTRING8>
    7cec:   45 e2          ldi   r20, 0x25   ; 37
    7cee:   54 e0          ldi   r21, 0x04   ; 4
    7cf0:   4c 0f          add   r20, r28
    7cf2:   5d 1f          adc   r21, r29
    7cf4:   af ef          ldi   r26, 0xFF   ; 255
    7cf6:   6a 2f          mov   r22, r26
    7cf8:   71 2d          mov   r23, r1
    7cfa:   85 e2          ldi   r24, 0x25   ; 37
    7cfc:   93 e0          ldi   r25, 0x03   ; 3
    7cfe:   8c 0f          add   r24, r28
    7d00:   9d 1f          adc   r25, r29
    7d02:   0e 94 89 02    call   0x512   ; 0x512 <fpc_shortstr_to_shortstr>
    7d06:   25 e2          ldi   r18, 0x25   ; 37
    7d08:   33 e0          ldi   r19, 0x03   ; 3
    7d0a:   2c 0f          add   r18, r28
    7d0c:   3d 1f          adc   r19, r29
    7d0e:   e3 e2          ldi   r30, 0x23   ; 35
    7d10:   f1 e0          ldi   r31, 0x01   ; 1
    7d12:   ec 0f          add   r30, r28
    7d14:   fd 1f          adc   r31, r29
    7d16:   21 93          st   Z+, r18
    7d18:   30 83          st   Z, r19
    7d1a:   49 e1          ldi   r20, 0x19   ; 25
    7d1c:   51 e0          ldi   r21, 0x01   ; 1
    7d1e:   4c 0f          add   r20, r28
    7d20:   5d 1f          adc   r21, r29
    7d22:   a5 e0          ldi   r26, 0x05   ; 5
    7d24:   2a 2f          mov   r18, r26
    7d26:   31 2d          mov   r19, r1
    7d28:   af ef          ldi   r26, 0xFF   ; 255
    7d2a:   6a 2f          mov   r22, r26
    7d2c:   71 2d          mov   r23, r1
    7d2e:   89 e1          ldi   r24, 0x19   ; 25
    7d30:   90 e0          ldi   r25, 0x00   ; 0
    7d32:   8c 0f          add   r24, r28
    7d34:   9d 1f          adc   r25, r29
    7d36:   0e 94 9c 03    call   0x738   ; 0x738 <fpc_shortstr_concat_multi>
    7d3a:   89 e1          ldi   r24, 0x19   ; 25
    7d3c:   90 e0          ldi   r25, 0x00   ; 0
    7d3e:   8c 0f          add   r24, r28
    7d40:   9d 1f          adc   r25, r29
    7d42:   0e 94 1f 14    call   0x283e   ; 0x283e <UFP_UARTSERIAL_ss_WRITELNsSHORTSTRING>
   ...


Сборка производилась Free Pascal 3.2.0
Я плохо знаю ассемблер AVR и прошу знатоков подсказать, что тут не так и чего с этим можно сделать.

P.S. Очень удивил в эльфе вызов процедуры "ARP_ss_PROCESSARPscrcEB739556" везде есть типизация переданных параметров а тут их нет.
Последний раз редактировалось OnOff 26.05.2021 14:47:49, всего редактировалось 1 раз.
OnOff
незнакомец
 
Сообщения: 6
Зарегистрирован: 25.05.2021 11:10:51

Re: AVR+Embedded Нужен совет специалистов

Сообщение Дож » 26.05.2021 07:26:21

1) Вложение нескольких include похоже больше не работают, так как define в них объявленные, к сожалению, теряются. Несколько вложенных {$ifdef XXX} вызывают у препрессора проблемы.

Приведите полностью пример, в котором воспроизводится ошибка. В вашем образце нет вложенных include и вложенных ifdef. Я проверил и то, и другое на своих примерах, вложенные конструкции препроцессора работают.

3) При компиляции(даже без оптимизации) возникают внутренние ошибки типа 2017091103.

По всем внутренним ошибкам нужно присылать примеры в багртрекер: https://bugs.freepascal.org/ и ждать официальных фиксов... На время ожидания можно пытаться как-то шаманить с кодом, менять его в разных местах, в надежде, что внутренняя ошибка пройдёт...

4) Внутри процедуры обнаруживаешь искажённую ARPPacket^.ARPData.TargetIP.

Я так понимаю, приведённый ассемблерный код не полный и обрывается на самом интересном месте (т.е. когда должна начаться подготовка ко второму вызову writeln)? Во всяком случае, вызов HEX_ss_HEXLsLONGINTssSTRING8 почему-то только один.

P.S. Очень удивил в эльфе вызов процедуры "ARP_ss_PROCESSARPscrcEB739556" везде есть типизация переданных параметров а тут их нет.

Выскажу предположение, что crcEB739556 -- это и есть "типизация", выраженная хэшом, чтобы название функции не было слишком длинным из-за большого числа аргументов.
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 878
Зарегистрирован: 12.10.2008 16:14:47

Re: AVR+Embedded Нужен совет специалистов

Сообщение zub » 26.05.2021 08:36:06

1)проблем не замечал, дайте полный минимальный пример
2)проблемы только в секции инициализации? дальше все ок? предположу что изза обилия циклических зависимостей юнитов между собой компилятор неможет выстроить правильную последовательность инициализайции
3)Проверте в транковой версии компилятора и на багтрекер
4)тоже что и 3
zub
долгожитель
 
Сообщения: 2809
Зарегистрирован: 14.11.2005 23:51:26

Re: AVR+Embedded Нужен совет специалистов

Сообщение OnOff » 26.05.2021 14:52:33

Исправил дизассемблированный ARP_ss_PROCESSARP. Теперь видно оба WriteLn. Пример проблемных include подготовлю.

Добавлено спустя 28 минут 52 секунды:
Пример include файлов. Файл global.inc вставляется во все файлы проекта.

global.inc
Код: Выделить всё
{.$define icpdas}
{$define net}
{$define debug}

{$ifdef icpdas}
{ $E+ $N- $G- $I- $L- $D-}

{$i icpdas.inc}

{.$define flush_msg} { -- Automaticaly flush messages for serial screen -- }
{$else}
{.$define dpmi}

{$i pc.inc}

{$endif}
{$ifdef net}

{$i net.inc}

{$endif}

{$ifndef icpdas}
{$define console}
{$define dosbox}
{$else}
{.$define can_master}
{.$define debug_can}
{$endif}


net.inc
Код: Выделить всё
{$define IP}
{$define UDP}
{$define TCP}
{$define DHCP}
{$define DNS}
{.$define IPX}
{.$define RPC}
{.$define NETBIOS}
{$define FTP}

{.$define delay_ack} {-- TCP delayed acknowledgment -- }
{.$define net_stat}
{$define hosts_file}

{$ifdef DHCP}
{$define UDP}
{$endif}

{$ifdef debug}
{ $define debug_pkt}
{ $define debug_ip}
{ $define debug_arp}
{ $define debug_icmp}
{ $define debug_dhcp}
{ $define debug_udp}
{ $define debug_tcp}
{ $define debug_dns}
{ $define debug_ipx}
{ $define debug_sntp}
{ $define debug_netbios}
{ $define debug_dgram)
{ $define debug_rpc}
{ $define debug_ftp}
{ $define debug_http}
{ $define debug_vxcomm}
{$endif}

{$ifndef ICPDAS}
{.$define BUS16} { -- not worked in icpdas(if not CPU R1120) -- }
{$endif}

{$ifndef dosbox}
{$define TCP_checksum_enable}
{$endif}


pc.inc
Код: Выделить всё
{$define dos}
{$define inifiles}
{$define DirectInt}


icpdas.inc
Код: Выделить всё
{.$define debug}
{$B-}{$G-}{$R-,S-,I-} {$T-,A+,X+}
{--- select model  ---}
{.$define iView100_20}
{.$define iView100_40}
{.$define i7188ea}
{.$define i7188ead}
{.$define i7188ex_256}
{.$define i7188ex_512}
{.$define i7188ex_mtcp}
{.$define i7188exd_256}
{.$define i7188exd_512}
{.$define i7188exd_mtcp}
{.$define i7188e1}
{.$define i7188e1d}
{.$define i7188e2}
{.$define i7188e2d}
{.$define i7188e3}
{.$define i7188e3d}
{.$define i7188e4}
{.$define i7188e4d}
{.$define i7188e5}
{.$define i7188e5d}
{.$define i7188e8}
{.$define i7188e8d}
{.$define i7521}
{.$define i7521d}
{.$define i7522}
{.$define i7522d}
{.$define i7522a}
{.$define i7522ad}
{.$define i7523}
{.$define i7523d}
{.$define i7524}
{.$define i7524d}
{.$define i7527}
{.$define i7527d}
{.$define i7560}
{.$define i7561}
{.$define i7563}
{.$define i7188_256}
{.$define i7188_512}
{.$define i7188d_256}
{.$define i7188d_512}
{.$define i7188xa}
{.$define i7188xad}
{.$define i7188xb_256}
{.$define i7188xb_512}
{.$define i7188xbd_256}
{.$define i7188xbd_512}
{.$define i7188xc}
{.$define i7188xcd}
{.$define i7188xc_256_rtc}
{.$define i7188xc_512_rtc}
{.$define i7188xcd_256_rtc}
{.$define i7188xcd_512_rtc}
{$define uPAC7186ex}


{----------------------------------------------------}
{  ($define CPUCLOCK20) CPU 20 MHz clock             }
{  ($define CPUCLOCK40) CPU 40 MHz clock             }
{  ($define CPUCLOCK80) CPU 80 MHz clock             }
{  ($define SRAM128)    128 kilobutes SRAM memory    }
{  ($define SRAM256)    256 kilobutes SRAM memory    }
{  ($define SRAM384)    384 kilobutes SRAM memory    }
{  ($define SRAM512)    512 kilobutes SRAM memory    }
{  ($define FLASHAUTO)  Automatically detect FLASH   }
{  ($define FLASH256)   256 kilobutes FLASH memory   }
{  ($define FLASH512)   512 kilobutes FLASH memory   }
{  ($define EEPROM2048) EEPROM 2048 bytes            }
{  ($define M24LC128)   EEPROM 16k bytes             }
{  ($define DS2502)     only 7188X/I-8000/7188E      }
{  ($define MAX7219)    digital led display model D  }
{  ($define T6963)      External display T6963       }
{  ($define iView_LED)  Keyboard leds for iView-100  }
{  ($define UART16C550) external serial port         }
{  ($define LED1)       single indicator into unit   }
{  ($define RTC)        RTC + NVRAM support          }
{  ($define ETHERNET)   Ethernet network support     }
{  ($define DM9000)     DM9000B Ethernet Controller  }
{  ($define X507)       X507 extension module        }
{  ($define XC100)      SJA1000 CAN meason module    }
{----------------------------------------------------}

{$define FLASHAUTO}
{.$define mstimer}

{ -=            iView100 Series                   =- }

{$ifdef iView100_20}
{$define CPUCLOCK20} { CPU 20 MHz clock             }
{$define iView100}
{$endif}

{$ifdef iView100_40
{$define CPUCLOCK40} { CPU 40 MHz clock             }
{$define iView100}
{$endif}

{$ifdef iView100}
{ russian font load... }
{$define int866}
{.$define ext866}
{$ifdef ext866}
  {$undef int866}
{$endif}

{$define R8820}      { CPU + Serial on chip         }
{$define SRAM512}    { 512 kilobutes SRAM memory    }
{$define EEPROM2048} { EEPROM 2048 bytes            }
{$define RTC}        { Enable RTC + NVRAM support   }
{$define T6963}      { External display             }
{$define iView_LED}  { Keyboard leds                }
{.$define DS2502}     { only 7188X/I-8000/7188E      }
{$define LED1}       { single indicator into unit   }
{$endif}

{ -=            i7188xa Series                    =- }

{$ifdef i7188xad}
  {$define MAX7219}   { Digital led display          }
  {$define i7188xa}
{$endif}

{$ifdef i7188xcd}
  {$define MAX7219}   { Digital led display          }
  {$define i7188xc}
{$endif}

{$ifdef i7188xa}
{$define CPUCLOCK40} { CPU 40 MHz clock             }
{$define R8820}      { CPU + Serial on chip         }
{$define SRAM512}    { 512 kilobutes SRAM memory    }
{$define EEPROM2048} { EEPROM 2048 bytes            }
{$define RTC}        { RTC + NVRAM support          }
{$define LED1}       { single indicator into unit   }
{$define UART16C550} { external serial port         }
{$endif}

{ -=            i7188xb Series                    =- }

{$ifdef i7188xb_256}
{$define i7188xb}
{$define SRAM256}    { 256 kilobutes SRAM memory    }
{$endif}

{$ifdef i7188xb_512}
{$define i7188xb}
{$define SRAM512}    { 512 kilobutes SRAM memory    }
{$endif}

{$ifdef i7188xbd_256}
{$define i7188xb}
{$define MAX7219}    { Digital led display          }
{$define SRAM256}    { 256 kilobutes SRAM memory    }
{$endif}

{$ifdef i7188xbd_512}
{$define i7188xb}
{$define MAX7219}    { Digital led display          }
{$define SRAM512}    { 512 kilobutes SRAM memory    }
{$endif}

{$ifdef i7188xb}
{$define CPUCLOCK40} { CPU 20 MHz clock             }
{$define R8820}      { CPU + Serial on chip         }
{$define RTC}        { RTC + NVRAM support          }
{$define EEPROM2048} { EEPROM 2048 bytes            }
{$define LED1}       { single indicator into unit   }
{$endif}

{ -=            i7188xc Series                    =- }

{$ifdef i7188xc}
{$define CPUCLOCK20} { CPU 20 MHz clock             }
{$define R8820}      { CPU + Serial on chip         }
{$define SRAM128}    { 128 kilobutes SRAM memory    }
{$define EEPROM2048} { EEPROM 2048 bytes            }
{$define LED1}       { single indicator into unit   }
{$endif}

{ -=            i7188e Series                     =- }

{$ifdef i7188e1}
{$define i7188e0}
{$endif}

{$ifdef i7188e1d}
{$define MAX7219}    { Digital led display          }
{$define i7188e0}
{$endif}

{$ifdef i7188e2}
{$define i7188e0}
{$endif}

{$ifdef i7188e2d}
{$define MAX7219}    { Digital led display          }
{$define i7188e0}
{$endif}

{$ifdef i7188e3}
{$define X507}
{$define i7188e0}
{$define UART16C550} { external serial port         }
{$endif}

{$ifdef i7188e3d}
{$define MAX7219}    { Digital led display          }
{$define X507}
{$define i7188e0}
{$define UART16C550} { external serial port         }
{$endif}

{$ifdef i7188e4}
{$define i7188e0}
{$define UART16C550} { external serial port         }
{$endif}

{$ifdef i7188e4d}
{$define MAX7219}    { Digital led display          }
{$define i7188e0}
{$define UART16C550} { external serial port         }
{$endif}

{$ifdef i7188e5}
{$define i7188e0}
{$define UART16C550} { external serial port         }
{$endif}

{$ifdef i7188e5d}
{$define MAX7219}    { Digital led display          }
{$define i7188e0}
{$define UART16C550} { external serial port         }
{$endif}

{$ifdef i7188e8}
{$define i7188e0}
{$define UART16C550} { external serial port         }
{$endif}

{$ifdef i7188e8d}
{$define MAX7219}    { Digital led display          }
{$define i7188e0}
{$define UART16C550} { external serial port         }
{$endif}

{$ifdef i7188ex_512}
{$define CPUCLOCK40} { CPU 40 MHz clock             }
{$define R8820}      { CPU + Serial on chip         }
{$define SRAM512}    { 256 kilobutes SRAM memory    }
{$define EEPROM2048} { EEPROM 2048 bytes            }
{$define LED1}       { single indicator into unit   }
{$define ETHERNET}   { Ethernet network support     }
{$define RTC}        { Enable RTC + NVRAM support   }
{$endif}

{$ifdef i7188e0}
{$define CPUCLOCK40} { CPU 40 MHz clock             }
{$define R8820}      { CPU + Serial on chip         }
{$define RTC}        { RTC + NVRAM support          }
{$define SRAM256}    { 256 kilobutes SRAM memory    }
{$define EEPROM2048} { EEPROM 2048 bytes            }
{$define LED1}       { single indicator into unit   }
{$define ETHERNET}   { Ethernet network support     }
{$undef i7188e0}
{$endif}

{ -=            uPAC7186e Series                  =- }

{$ifdef uPAC7186ex}
{$define CPUCLOCK80} { CPU 80 MHz clock             }
{$define R8820}      { CPU + Serial on chip         }
{$define SRAM512}    { 512 kilobutes SRAM memory    }
{$define FLASHAUTO}  { Automatically detect FLASH   }
{$define M24LC128}   { EEPROM 16k bytes             }
{$define RTC}        { RTC + NVRAM support          }
{$define LED1}       { single indicator into unit   }
{$define ETHERNET}   { Ethernet network support     }
{$define DM9000}     { DM9000B Ethernet Controller  }
{$define MAX7219}    { digital led display model D  }
{$endif}

{$R-} { disable range checking }

Компиляцию я пройти не могу.
OnOff
незнакомец
 
Сообщения: 6
Зарегистрирован: 25.05.2021 11:10:51

Re: AVR+Embedded Нужен совет специалистов

Сообщение Vadim » 26.05.2021 15:44:49

OnOff писал(а):Компиляцию я пройти не могу.

А заодно не выкладываю сообщение компилятора... :D
Vadim
долгожитель
 
Сообщения: 4061
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: AVR+Embedded Нужен совет специалистов

Сообщение zub » 26.05.2021 16:24:40

>>{ $define debug_dgram)<<
в net.inc вместо фигурной скобки - гладкая
zub
долгожитель
 
Сообщения: 2809
Зарегистрирован: 14.11.2005 23:51:26

Re: AVR+Embedded Нужен совет специалистов

Сообщение OnOff » 26.05.2021 16:40:18

Глазастые :) Согласен. Но Borland pascal 7.0 сожрал и так. Как Карл? Только что проверил.
Сейчас меня больше беспокоит передача параметров в процедуру. Портится последний параметр. Если не решу проблему, то буду пробовать ARM. В свое время писал под ARM WinCE. Все работало. А в этом проекте придется обойтись без OS. Работа с "железом" ARM очень неприятная штука.
OnOff
незнакомец
 
Сообщения: 6
Зарегистрирован: 25.05.2021 11:10:51

Re: AVR+Embedded Нужен совет специалистов

Сообщение zub » 26.05.2021 16:45:22

Borland не поддерживал вложенные комментарии. Почему глазастые ругань компилятора читать надо
zub
долгожитель
 
Сообщения: 2809
Зарегистрирован: 14.11.2005 23:51:26

Re: AVR+Embedded Нужен совет специалистов

Сообщение Дож » 26.05.2021 22:05:27

Я немного почитал ассемблерный код. Вызывающая часть размещает байты последнего аргумента в адресах Z,Z+1,Z+2 и Z+3, в самой функции они читаются уже из Y+2,Y+3,Y+4 и Y+5. В какой момент должно было стать Z=Y+2 и должно ли было мне непонятно. Имеет смысл отправить пример с ошибкой в багтрекер.

Баг можно попытаться обойти, разместив аргументы в записи:
Код: Выделить всё
type
PProcessARPArguments = ^TProcessARPArguments;
TProcessARPArguments = record
  Adapter : PNetworkAdapter;
  SourceEtherAddr : TMACAddress;
  Operation : word;
  PLEN: byte;
  SenderHA : TMACAddress;
  SenderPA: TIPAddress;
  TargetHA : TMACAddress;
  TargetPA: TIPAddress;
end;

procedure ProcessARP(Args: PProcessARPArguments);
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 878
Зарегистрирован: 12.10.2008 16:14:47

Re: AVR+Embedded Нужен совет специалистов

Сообщение OnOff » 27.05.2021 14:53:33

Спасибо "Дож". Именно это я и хотел понять. Передача параметров процедурам и функциям в виде структуры в моём случае невозможна, так как таких у меня много. Попробую обратиться на багтреккер. Это ведь это явная ошибка компилятора. Если у кого-то будет передаваться процедуре(функции) более 7 параметров то возникнут проблемы. Надо лечить.
OnOff
незнакомец
 
Сообщения: 6
Зарегистрирован: 25.05.2021 11:10:51

Re: AVR+Embedded Нужен совет специалистов

Сообщение OnOff » 23.06.2021 16:32:02

Простой опыт:
Код: Выделить всё
program test;
uses
  ufp_uartserial;

procedure TestParam(p1, p2, p3, p4, p5, p6, p7, p8, p9 : dword);
begin
  writeln('p1=0x' + hexstr(p1, 8) + ' p2=0x' + hexstr(p2, 8) + ' p3=0x' + hexstr(p3, 8));
  writeln('p4=0x' + hexstr(p4, 8) + ' p5=0x' + hexstr(p5, 8) + ' p6=0x' + hexstr(p6, 8));
  writeln('p7=0x' + hexstr(p7, 8) + ' p8=0x' + hexstr(p8, 8) + ' p9=0x' + hexstr(p9, 8));
end;

begin
  UARTInit(57600);
  TestParam(1, 2, 3, 4, 5, 6, 7, 8, 9);
  repeat
  until false;
end.

Результат работы:
p1=0x00000001 p2=0x00000002 p3=0x00000003
p4=0x00000004 p5=0x00000001 p6=0x00000002
p7=0x00000003 p8=0x00000004 p9=0x00000001

CPU: ATMEGA1284P
Итог: FPC для AVR позволяет передать процедуре/функции только 16 байт параметров. Пока это исправлять не хотят.
OnOff
незнакомец
 
Сообщения: 6
Зарегистрирован: 25.05.2021 11:10:51

Re: AVR+Embedded Нужен совет специалистов

Сообщение zub » 23.06.2021 22:37:15

>>Пока это исправлять не хотят.
Основная трудность не найти баг \ написать патч, а привлечь внимание разрабов))
zub
долгожитель
 
Сообщения: 2809
Зарегистрирован: 14.11.2005 23:51:26

Re: AVR+Embedded Нужен совет специалистов

Сообщение Alex2013 » 24.06.2021 10:30:29

OnOff писал(а): 16 байт параметров.

Извиняюсь , но ли обязательно использовать именно такой формат данных в параметрах процедуры ?

В качестве временного решения можно например передавать данные одной форматированной строкой, а внутри процедуры парсить ее на отдельные переменные. (использовал этот прием для передачи параметров в скрипт, где когда-то была похожая проблема ) Разумеется это то что называется "костыль" , но если все будет работать стабильно то почему бы и нет? Как говорится "вам шашечки или ехать" ?
Последний раз редактировалось Alex2013 24.06.2021 23:03:25, всего редактировалось 1 раз.
Alex2013
долгожитель
 
Сообщения: 2400
Зарегистрирован: 03.04.2013 11:59:44

Re: AVR+Embedded Нужен совет специалистов

Сообщение wavebvg » 24.06.2021 11:30:57

zub писал(а):Основная трудность не найти баг написать патч, а привлечь внимание разрабов

В данном случае нет. Был бы патч, сразу начали бы придумывать, как его применить. А если серьёзно, то передавать 16Байт (16 переменных в разрядности процессора!), как мне кажется, должно приводить в прерыванию StackOverflow и всё должно падать на этом месте (как это в МК выглядит не важно).
А если разбираться по сути:
Код: Выделить всё
# [23] TestParam(1, 2, 3, 4, 5, 6, 7, 8, 9);
   ldi   r21,9
   mov   r30,r13
   mov   r31,r14
   std   Z+16,r21
   std   Z+17,r1
   std   Z+18,r1
   std   Z+19,r1
   ldi   r21,8
   mov   r30,r13
   mov   r31,r14
   std   Z+12,r21
   std   Z+13,r1
   std   Z+14,r1
   std   Z+15,r1
   ldi   r21,7
   mov   r30,r13
   mov   r31,r14
   std   Z+8,r21
   std   Z+9,r1
   std   Z+10,r1
   std   Z+11,r1
   ldi   r21,6
   mov   r30,r13
   mov   r31,r14
   std   Z+4,r21
   std   Z+5,r1
   std   Z+6,r1
   std   Z+7,r1
   ldi   r21,5
   mov   r30,r13
   mov   r31,r14
   st   Z,r21
   std   Z+1,r1
   std   Z+2,r1
   std   Z+3,r1
   ldi   r26,4
   mov   r10,r26
   mov   r11,r1
   mov   r12,r1
   mov   r13,r1
   ldi   r26,3
   mov   r14,r26
   mov   r15,r1
   mov   r16,r1
   mov   r17,r1
   ldi   r18,2
   mov   r19,r1
   mov   r20,r1
   mov   r21,r1
   ldi   r22,1
   mov   r23,r1
   mov   r24,r1
   mov   r25,r1
   call   PsTIMERSTEST_ss_TESTPARAMscrcEA7CF4C0


Тут сразу становится понятно, что я стратег, а не тактик, потому что всё, кажется, передали.

p1: r22...r25
p2: r18...r21
p3: r14...r17
p4: r10...r13
p5: Z+0...Z+3
p6: Z+4...Z+7
p7: Z+8...Z+11
p8: Z+12...Z+15

Под вопросом только то, что находится в регистрах R13,R14, но мне кажется указатель на начало стека.

Теперь посмотрим, как Мы читаем параметры:
Код: Выделить всё

   push   r29
   push   r28
   push   r17
   push   r16
   push   r15
   push   r14
   push   r13
   push   r12
   push   r11
   push   r10
   push   r9
   push   r8
   push   r7
   push   r6
   push   r5
   push   r4
   push   r3
   push   r2
   in   r28,61
   in   r29,62
   subi   r28,24
   sbci   r29,2
   in   r0,63
   cli
   out   62,r29
   out   63,r0
   out   61,r28
# Var p1 located in register r22
   movw   r2,r18
   movw   r4,r20
# Var p2 located in register r2
   mov   r7,r14
   mov   r6,r15
   mov   r8,r16
   mov   r15,r17
# Var p3 located in register r7
   ldi   r26,21
   ldi   r27,2
   add   r26,r28
   adc   r27,r29
   st   X,r10
   ldi   r26,23
   ldi   r27,2
   add   r26,r28
   adc   r27,r29
   st   X,r11
   mov   r11,r13
# Var p4 located in register r18
   ldd   r18,Y+2
   ldi   r26,22
   ldi   r27,2
   add   r26,r28
   adc   r27,r29
   st   X,r18
   ldd   r18,Y+3
   ldi   r26,20
   ldi   r27,2
   add   r26,r28
   adc   r27,r29
   st   X,r18
   ldd   r18,Y+4
   ldi   r26,19
   ldi   r27,2
   add   r26,r28
   adc   r27,r29
   st   X,r18
   ldd   r18,Y+5
   ldi   r26,18
   ldi   r27,2
   add   r26,r28
   adc   r27,r29
   st   X,r18
# Var p5 located in register r18
   ldd   r18,Y+6
   ldi   r26,17
   ldi   r27,2
   add   r26,r28
   adc   r27,r29
   st   X,r18
   ldd   r18,Y+7
   ldi   r26,16
   ldi   r27,2
   add   r26,r28
   adc   r27,r29
   st   X,r18
   ldd   r18,Y+8
   ldi   r26,15
   ldi   r27,2
   add   r26,r28
   adc   r27,r29
   st   X,r18
   ldd   r18,Y+9
   ldi   r26,14
   ldi   r27,2
   add   r26,r28
   adc   r27,r29
   st   X,r18
# Var p6 located in register r18
   ldd   r18,Y+10
   ldi   r26,13
   ldi   r27,2
   add   r26,r28
   adc   r27,r29
   st   X,r18
   ldd   r18,Y+11
   ldi   r26,12
   ldi   r27,2
   add   r26,r28
   adc   r27,r29
   st   X,r18
   ldd   r18,Y+12
   ldi   r26,11
   ldi   r27,2
   add   r26,r28
   adc   r27,r29
   st   X,r18
   ldd   r18,Y+13
   ldi   r26,10
   ldi   r27,2
   add   r26,r28
   adc   r27,r29
   st   X,r18
# Var p7 located in register r18
   ldd   r18,Y+14
   ldi   r26,9
   ldi   r27,2
   add   r26,r28
   adc   r27,r29
   st   X,r18
   ldd   r18,Y+15
   ldi   r26,8
   ldi   r27,2
   add   r26,r28
   adc   r27,r29
   st   X,r18
   ldd   r18,Y+16
   ldi   r26,7
   ldi   r27,2
   add   r26,r28
   adc   r27,r29
   st   X,r18
   ldd   r18,Y+17
   ldi   r26,6
   ldi   r27,2
   add   r26,r28
   adc   r27,r29
   st   X,r18
# Var p8 located in register r18
   ldd   r18,Y+18
   ldi   r26,5
   ldi   r27,2
   add   r26,r28
   adc   r27,r29
   st   X,r18
   ldd   r18,Y+19
   ldi   r26,4
   ldi   r27,2
   add   r26,r28
   adc   r27,r29
   st   X,r18
   ldd   r18,Y+20
   ldi   r26,3
   ldi   r27,2
   add   r26,r28
   adc   r27,r29
   st   X,r18
   ldd   r18,Y+21
   ldi   r26,2
   ldi   r27,2
   add   r26,r28
   adc   r27,r29
   st   X,r18
# Var p9 located in register r18

При чтении регистров начинается настоящая мистика!
Передача параметров на вывод тоже вызывает много вопросов.
Так что проблема не столько в "передается только 16Байт", а в том, что только 16Байт принимающая функция корректно отображает. Более того, зачем-то начинает тасовать значения в регистрах, вызывая искреннее удивление.

Добавлено спустя 8 минут 35 секунд:
OnOff, не могли бы Вы провести тестирование на вот таком примере:

Код: Выделить всё
program test;
uses
  ufp_uartserial;

procedure TestParam(p1, p2, p3, p4, p5, p6, p7, p8, p9 : dword);
begin
  writeln(hexstr(p1, 8));
  writeln(hexstr(p2, 8));
  writeln(hexstr(p3, 8));
  writeln(hexstr(p4, 8));
  writeln(hexstr(p5, 8));
  writeln(hexstr(p6, 8));
  writeln(hexstr(p7, 8));
  writeln(hexstr(p8, 8));
  writeln(hexstr(p9, 8));
end;

begin
  UARTInit(57600);
  TestParam(1, 2, 3, 4, 5, 6, 7, 8, 9);
  repeat
  until false;
end.
wavebvg
постоялец
 
Сообщения: 321
Зарегистрирован: 28.02.2008 04:57:35

Re: AVR+Embedded Нужен совет специалистов

Сообщение OnOff » 24.06.2021 13:05:42

RE:wavebvg
Результат не изменился. только печать значений через строку. IP стек у меня собрался и не падал. Стек не разрушался. Вот только результат его работы меня не порадовал... Как только я стал передавать параметров <16 байт (реализовано через структуру) то процедуры и функции начинали работать правильно. Да это костыль. Компилятор не сообщает, что собранный код может работать неправильно.
ЗЫ: Ходить с костылями можно, но лучше ходить без них.
OnOff
незнакомец
 
Сообщения: 6
Зарегистрирован: 25.05.2021 11:10:51


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7

Рейтинг@Mail.ru
cron