16+
Воскресенье
22 июля
Вход |Карта сайта | |Upload |codebook | PARTS

 О смысле всего сущего 0xFF

 Средства и методы разработки

 Мобильная и беспроводная связь

 Блошиный рынок Объявления

caxapa

Микроконтроллеры ARM 

AVR PIC MSP PLD,FPGA,DSP 

Кибернетика Технологии 

Схемы, платы, компоненты 

Микроконтроллеры

 
   Новая тема Правила Регистрация Поиск »» Архив
Вернуться в конференциюТопик полностью
sladkoejka  (05.07.2018 13:49 - 05.07.2018 14:00) , в ответ на Корректный код генерируется в обоих случаях автор: Bill
Обнаружил интересное различие в коде который не работает и коде, который работает. Вот сам код примера: 
#include <ioCY7C68013A.h>
#include <intrinsics.h>

void delay(unsigned long n)
{
    while( n-- > 0 ) 
        __no_operation();
}

void main( void )
{
    SOEA = 0x03;        // Enable Port A Pins: 0, 1 (LED0 & LED1)
    IOA = 0x03;         // LED0 & LED1 off
    for (;;)
    {
        IOA = 0x02;     // LED0 on
        delay(10000);
        IOA = 0x03;     // LED0 off
        delay(10000);
    }
}
Для точной подстройки адреса, куда компилятор будет класть код, используется также небольшой асм файл:
    COMMON  INTVEC:CODE:ROOT(0)
    ORG     0x4f
    nop
    END
В таком виде код не работает. Но если заменить на ORG 0x50, то код работает. Разница должна быть только в адресе начала кода. Однако обнаружил, что компилятор немного модифицирует и код. Вот фрагмент рабочего кода:
 0000E7  00              NOP
 0000E8  85 08 0C        MOV   0xC,0x8
 0000EB  85 09 0D        MOV   0xD,0x9
 0000EE  85 0A 0E        MOV   0xE,0xA
 0000F1  85 0B 0F        MOV   0xF,0xB
 0000F4  79 10           MOV   R1,#0x10
 0000F6  78 08           MOV   R0,#0x08
 0000F8  12 00 83        LCALL 0x0083
 0000FB  E5 0C           MOV   A,0xC
 0000FD  45 0D           ORL   A,0xD
 0000FF  45 0E           ORL   A,0xE
 000100  0E              INC   R6            ; <= обращаем внимание сюда
 000101  45 0F           ORL   A,0xF
 000103  70 E2           JNZ   0x00E7
 000105  7F 08           MOV   R7,#0x08
 000107  02 00 BE        LJMP  0x00BE
А вот тот-же фрагмент нерабочего кода:
 0000E6  00              NOP
 0000E7  85 08 0C        MOV   0xC,0x8
 0000EA  85 09 0D        MOV   0xD,0x9
 0000ED  85 0A 0E        MOV   0xE,0xA
 0000F0  85 0B 0F        MOV   0xF,0xB
 0000F3  79 10           MOV   R1,#0x10
 0000F5  78 08           MOV   R0,#0x08
 0000F7  12 00 82        LCALL 0x0082
 0000FA  E5 0C           MOV   A,0xC
 0000FC  45 0D           ORL   A,0xD
 0000FE  45 0E           ORL   A,0xE
 000100  45 0F           ORL   A,0xF          ; <= обращаем внимание сюда
 000102  70 E2           JNZ   0x00E6
 000104  7F 08           MOV   R7,#0x08
 000106  02 00 BD        LJMP  0x00BD
Это код функции delay. Очень странно... Такое впечатление, что компилятор забыл добавить INC R6. Однако не совсем ясно что там происходит. Что интересно, в debug режиме код совсем другой. Нужно разбираться...
 [x][x][x][x][x][x] [x][x][x][x][x][x][x][x]

Тема выделяется по переводу строки или автоматом

 

Имя


Регистрация позволит вам редактировать и перемещать ваши сообщения и прикреплять к ним файлы.
 
Символы: á é ó ú ý « »
Главная | Карта сайта | О проекте | Проекты | Файлообменник | Регистрация | Вебмастер | RSS
Лето 7526 от сотворения мира. При использовании материалов сайта ссылка на caxapу обязательна.
MMI © MMXVIII