Перейти к содержанию
    

ek74

Свой
  • Постов

    81
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные ek74


  1. С KEIL GNU я не работал, использую WinArm GCC.

     

    Там для вывода делаю так:

    arm-elf-size.exe target.elf
    
       text       data        bss        dec        hex    filename
      45452          0      27552      73004      11d2c    build/tech/exe/target.elf

    Или так:

    arm-elf-size.exe -A target.elf
    
    build/tech/exe/target.elf  :
    section             size       addr
    .text              14956          0
    .rodata               76      14956
    .data              30420   67108864
    .bss               25504   67139284
    .stack              2048   67164928
    .comment             522          0
    .debug_aranges      1336          0
    .debug_pubnames     3644          0
    .debug_info        31312          0
    .debug_abbrev       6238          0
    .debug_line        10633          0
    .debug_frame        3444          0
    .debug_str          5972          0
    .debug_loc         21076          0
    .debug_ranges       2456          0
    Total             159637

    Попробуй сделать по аналогии.

  2. На сайте STMicroelectronics появилась информация о новом семействе STM32 с ядром Cortex-M3.

     

    ■ Core

    – ARM 32-bit Cortex-M3TM CPU

    – 36 MHz, 45 DMips with 1.25 DMips/MHz (STM32F101x)

    – 72 MHz, 90 DMips with 1.25 DMips/MHz (STM32F103x)

    – Single-cycle multiplication and hardware division for computational acceleration

    ■ Memories

    – From 32 Kbytes to 128 Kbytes Flash memory

    – From 6 Kbytes to 16 Kbytes SRAM (STM32F101x)

    – From 6 Kbytes to 20 Kbytes SRAM (STM32F103x)

    – Multi-boot capability

    ■ Clock, Reset and Supply Management

    – 2.0 to 3.6V application supply and I/Os

    – Internal regulator for core supply

    – Embedded high-speed quartz oscillator from 4 to 16 MHz

    – Power on / power down reset (POR/PDR), programmable voltage detector (PVD), brown-out detector

    – Embedded RTC oscillator running from external 32 kHz crystal

    – Internal factory-trimmed RC running at 8 MHz

    – Internal RC running at 32 kHz

    – Embedded PLL for CPU clock

    – Real-Time Clock with calibration capability for precise clock-calendar function

    ■ Low Power

    – 3 power saving modes: SLEEP, STOP and STANDBY with automatic wake up

    – VBAT supply for RTC and backup registers

    ■ Nested Interrupt Controller

    – Superior multiple vector interrupt handling

    – 43 maskable interrupt channels (not including the 16 interrupt lines of Cortex-M3)

    – Very low latency interrupt processing down to 6 CPU cycles with tail-chaining

    ■ Debug Mode

    – Serial wire debug (SWD) and JTAG interfaces

    – Serial wire viewer

    – 8 hardware breakpoints

    ■ DMA

    – 7-channel DMA controller

    – Circular buffer management

    – Peripherals supported: timers, ADC, SPI, I2C and USART

    ■ 12-bit A/D Converter (16-channel) (STM32F101x)

    ■ 2 x 12-bit A/D Converters (16-channel) (STM32F103x)

    – Sampling frequency up to 1 MHz

    – Conversion range: 0 to 3.6V

    – Auto-calibration

    – Auto-scan mode

    – Temperature sensor

    ■ Up to 80 Fast I/O Ports

    – 32/49/80 multifunctional bidirectional 5V-tolerant I/Os

    – All mappable on 16 external interrupts

    – Up to 80 ports with external interrupt capability

    – Possibility of locking the I/O in chosen alternate function configuration

    – Atomic read/modify/write operations

    – I/Os on APB2 with up to 18 MHz toggling speed (STM32F103x)

    ■ Up to 6 Timers (STM32F101x)

    ■ Up to 7 Timers (STM32F103x)

    – Up to 3 synchronizable 16-bit timers, each with up to 4 channels used for input captures/output compares, PWM or pulse counter

    – 16-bit 6-channel advanced control timer, configurable with up to 4 channels for input capture/output compare (STM32F103x)

    – 2 x 16-bit watchdog timers (Independent and Window)

    – SysTick timer: a 24-bit down counter with auto reload capability with programmable clock source for timebase functions

    ■ Up to 7 Communication Interfaces (STM32F101x)

    ■ Up to 9 Communication Interfaces (STM32F103x)

    – Up to 2 x I2C interfaces (SMBus/PMBus)

    – Up to 3 USARTs asynchronous serial interfaces (2.25 MBit/s), providing Smart Card ISO7816 interface, LIN master slave capability, IrDA capability, Modem control

    – Up to 2 SPI synchronous serial interfaces (18 Mbit/s)

    – CAN interface (2.0B Active) (STM32F103x)

    – USB 2.0 full speed interface (STM32F103x)

    ■ Operating Temp.: -40 to +85 °C / -40 to +105 °C

    ■ Packages: LQFP48, LQFP64, LQFP100, BGA100

  3. Если оно не инлайн, то что мешает полностью асм-овую функцию написать?

    В программе функция fr32_mul реализованна как инлайн, просто в вопросе я это опустил.

     

    Можно опять же встроенную в С, только объявить её c __attribute__((naked)), стандарт на ARM по передаче параметров вроде компиляторами поддерживается.

    Тип fx64 имеет следующее представление: si.f, где s - знаковый бит, i - целая часть (23 бита), f - дробная часть (40 бит). Сейчас функция fx64_mul реализована без найкед, следующим образом

    fx64 fx64_mul(fx64 arg1, fx64 arg2)
    {
        register fx64 result asm("r0"); // Это формальность, а то gcc страшно ругается
        asm
        (
            "umull    r5, ip, r0, r2        \n"
            "umull    lr, r5, r1, r2        \n"
            "mov    r4, r1, asr #31        \n"
            "mla    r4, r2, r4, r5        \n"
            "adds    r2, lr, ip            \n"
            "adc    ip, r4, #0            \n"
            "umull    r4, lr, r0, r3        \n"
            "mov    r5, r3, asr #31        \n"
            "mla    r5, r0, r5, lr        \n"
            "adds    r4, r4, r2            \n"
            "adc    r5, r5, ip            \n"
            "mov    r4, r4, lsr #8        \n"
            "orr    r2, r4, r5, lsl #24    \n"
            "smull    r4, ip, r1, r3        \n"
            "mov    r3, r5, asr #8        \n"
            "mov    ip, ip, lsl #24        \n"
            "orr    r1, ip, r4, lsr #8    \n"
            "mov    r0, r4, lsl #24        \n"
            "adds    r0, r0, r2            \n"
            "adc    r1, r1, r3            \n"
            : /* no outputs */
            : /* no inputs */
            : "r0", "r1", "r2", "r3", "r4", "r5", "ip", "lr"
        );
        return result; // Это формальность, а то gcc страшно ругается
    }

    Но мне так не очень нравится, поэтому и задал вопрос...

     

    Ещё не понял про FR32_FRACTION_BITS и "lsl #2". У Вас FR32_FRACTION_BITS может быть только 30? Или не нашли как из 32-х вычесть FR32_FRACTION_BITS (видимо можно так "lsl #(32 - %a3)" )?

    Тут я согласен - вышла ошибочка, спасибо. Хотя с другой стороны FR32_FRACTION_BITS у меня всегда 30. Но для универсальности надо исправить.

  4. Возникла проблема при использовании inline assembler в ARM GCC. Есть следующий работающий код:

    typedef signed long        fr32;
    typedef signed long long fx64;
    
    fr32 fr32_mul(fr32 arg1, fr32 arg2)
    {
      fr32 result;
      asm
      (
        "smull ip, r3, %1, %2    \n"
        "mov  ip, ip, lsr #%a3    \n"
        "orr    %0, ip, r3, lsl #2    \n"
        : "=r" (result)
        : "r" (arg1), "r" (arg2), "I" (FR32_FRACTION_BITS)
        : "r3", "ip"
        );
      return result;
    }

    В нём аргумены и результат ("=r" (result), "r" (arg1), "r" (arg2)) 32-битные, а как описать 64-битные данные непонятно?

    fx64 fx64_mul(fx64 arg1, fx64 arg2)
    {
      fx64 result;
      asm
      (
    ...
        : "=r" (result)        // <- Какие модификатор тут должны быть ?
        : "r" (arg1), "r" (arg2)    // <- Какие модификатор тут должны быть ?
      );
    return result;
    }

    Есть, конечно, вариант реализовать аргументы и результат через объединение:

    union 
    {
      fx64 value;
      struct 
      {
        signed long msw;
        unsigned long lsw;
      } words;
    };

    Но может, есть способ проще?

     

    К слову сказать для msp430 gcc существуют модификаторы:

    • %A[tag] acts as %[tag] for a register or address constant operand, or wraps an integer value as #llo(). #llo is an
    assembler macro, which extracts the lower 16 bits of the value.
    • %B[tag] adds 1 to a register number, or 2 to an address constant, or substitutes #lhi() for an integer constant.
    • %C[tag] adds 2 to a register number, or 4 to an address constant, or substitutes #hlo() for an integer constant.
    • %D[tag] adds 3 to a register number, 6 to an address constant, or substitutes #hhi() for an integer constant.
    
    #define LONGVAL 0x12345678l
    {
      long a, b;
    ...
      asm("mov %A2, %A0 \n\t"
             "mov %B2, %B0 \n\t"
             "mov %A2, %A1 \n\t"
             "mov %B2, %B1 \n\t"
             : "=r"((long)a), "=m"((long)b)
             : "i"((long)LONGVAL) );
    ...
    }

    А вот для arm gcc, я что-то подобного не нашёл.

  5. Эта... а вы не думаете что вообще неплохо бы научится пересобирать тулчейн и либы заодно? Раньше, на заре линукса, все подобные кривости так и побеждались - пресборкой на собственной машине. Вот с товарищем кленом выпустили бы какой нибудь мануал или faq по пересборке и я бы может научился уже. :)

     

    Думаю, но пока не умею я этого делать :( (GCC только осваиваю, до этого использовал RVDS). А если уважаемый klen расскажет как собирать GCC+либы под MinGW, то это будет замечательно!

  6. Вот решил попробовать зверька, скачал, начал собирать старый код...

    И вот линкер вылетает со следующим матом :

     

    И как это понимать? Либы собраны для работы с сопром? Спрашивается под какие камни?

     

    Я сегодня столкнулся сам с подобной ситуацией для str910fw32, только с WinARM. Если сделать вот так:

    arm-elf-objdump -p libm.a

    то увидим

    In archive libm.a:
    e_acos.o:     file format elf32-littlearm
    private flags = 0: [APCS-32] [FPA float format]
    ...
    wrf_lgamma.o:     file format elf32-littlearm
    private flags = 0: [APCS-32] [FPA float format]

    Победил следующим образом: взял библиотеки из Anglia SARM Toolchain, и тупо заменил WinARM'овские.

    Эти библиотеки вроде собраны правильно:

    In archive libm.a:
    e_acos.o:     file format elf32-littlearm
    private flags = 200: [APCS-32] [FPA float format] [software FP]
    ...
    wrf_lgamma.o:     file format elf32-littlearm
    private flags = 200: [APCS-32] [FPA float format] [software FP]

  7. В прайсах встречается STR910FAM32X6 и STR910FM32X6, в чём разница ?

     

    У ST на сайте есть документ, называется: "STR910F MCU Series - 32-bit ARM9-based Flash Microcontrollers Presentation". Там написано следующее:

    Future Devices
    * Version “A” devices coming Q107
       - Peak performance remains at 96 MIPS, but average perf will be +20% or more
       - Version “A” backwards compatible with current devices
       - New part number, example: STR912FW44X6 becomes STR912FAW44X6
    * 144-ball LFBGA package option available Q107
       - New signals for external synchronous burst SRAM and Flash memories

  8. ; Enter the C code

     

    IMPORT __main

    LDR R0, =__main

    BX R0

    Хде???? Хде оно, копроварие кода?

    У Realview __main не тоже самое, что int main(void). Вот выдержка из "RealView Compilation Tools Version 3.0 for μVision Compiler and Libraries Guide":

    The entry point of a program is at __main in the C library where library code does the following:
    1. Copies nonroot (RO and RW) execution regions from their load addresses to their execution addresses. Also, if any data sections are compressed, they are decompressed from the load address to the execution address. See RealView Compilation Tools v3.0 Linker and Utilities Guide for more details.
    2. Zeroes ZI regions.
    3. Branches to __rt_entry.

    и далее

    The library function __rt_entry() runs the program as follows:
    1. Calls __rt_stackheap_init() to set up the stack and heap.
    2. Calls __rt_lib_init() to initialize referenced library functions, initialize the locale and, if necessary, set up argc and argv for main(). For C++, calls the constructors for any top-level objects by way of __cpp_initialize__aeabi_. See C++ initialization, construction, and destruction
    on page 5-32 for more details.
    3. Calls main(), the user-level root of the application. From main(), your program might call, among other things, library functions. See Library functions called from main() on page 5-35 for more information.
    4. Calls exit() with the value returned by main().

    Т.е. мы имеем последовательность вызовов startup -> __main -> __rt_entry -> main, по ходу которой и происходит инициализация кучи, стека, библиотек и областей памяти.

  9. Появилась необходимость посмотреть на исходники стандартных библиотек, в частности интересует реализация плавающей точки.

     

    Может кто-нибудь поделится исходниками стандартных библиотек от IAR for ARM 4.30, 4.41 или от RVMDK 3.03. Буду очень благодарен.

  10. Сейчас вот смотрю на стартовый файл проекта для AT91SAM7S (который в комплекте идёт) и никак не могу понять, что за команда такая - ADR? Вот кусок кода на ассемблере (во второй строке):

    IF :DEF:RAM_INTVEC

    ADR R8, Vectors ; Source

    LDR R9, =RAM_BASE ; Destination

    LDMIA R8!, {R0-R7}

     

    В системе команд ARM7TDMI ADR вроде нет. Так что это такое?

    Компилиться она вот во что: SUB R8, PC, #0x000000B8.

    Просто LDR вместо неё поставить не получается.

    Объясните, пожалуйста :)

     

    В поставке KEIL'а есть файл <..>\ARM\Hlp\RV_asm.pdf "RealView Compilation Tools Version 3.0 for μVision Assembler Guide"

    Открываем его и в разделе "2.6.1 Direct loading with ADR and ADRL" читаем:

    The ADR and ADRL pseudo-instructions enable you to generate an address, within a certain
    range, without performing a data load. ADR and ADRL accept a program-relative
    expression, that is, a label with an optional offset where the address of the label is
    relative to the current PC.

    и чуть ниже

    The assembler converts an ADR rn,label pseudo-instruction by generating:
    • a single ADD or SUB instruction that loads the address, if it is in range
    • an error message if the address cannot be reached in a single instruction.

     

    Т.е. ADR - это не команда ARM7TDMI, а просто инструкция ассемблера, облегчающая процесс разработки :)

  11. Ещё вопрос, вернее проясните ситуацию с таймерами.

     

    To AlexandrY: Вы пишите таймеры сбрасываются не в 0, а в 0xFFFC, т.е. имеется в виду вот это - Writing in the TIM_CNTR register resets the free running counter to the FFFCh value (STR91xF reference manual, стр. 126). Судя по тому, что регистр TIM_CNTR доступен только на чтение, запись в него любого значения приводит к сбросу регистра счёта в состояние 0xFFFC. Я правильно понял?

     

    To SGP: Что Вы имели ввиду - Таймер убогий нет даже автоперезагрузки?

  12.  

    Спасибо, но это я уже видел. Мне хочется большего :) , так сказать "личных впечатлений" от общения с этими камнями: как ведёт себя периферия, есть ли какие ошибки (ерату я уже смотрел), ну т.д. и т.п.

     

    Попутно еще вопрос: кто у нас (в России) этим реально торгует. Просто я делал поиск поставщиков и результаты очень меня расстроили :( . Практически ноль.

  13. Ну допустим. Тогда как проще (и желательно красивее) всего прочитать число допустим float с байтового адреса?

     

    Как выриант:

    float val;
    char *ptr = getAddr();
    memcpy(&val, ptr, sizeof(val));

     

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

  14. конечно, это нужно сделать обязательно. где разместить - в новостях?

    Думаю да, и закрепить эту тему сразу после темы "Взлом форума 29.07".

    ---------

    to udofun:

    Т.к. вроде всё раскидали, то права модератора с меня можно снять. Если в дальнейшем будет нужна помощь, то всегда готов :)

  15. Помоему это как раз то, что мне надо :a14: !

    Большое спасибо! :cheers:

     

    Будут вопросы - спрашивайте, только единственное но: с завтрешнего дня я ухожу на две недели в отпуск (у меня дочь родилась и хочу первое время побыть с ней :wub: ). Если для Вас время ответа не очень критично, то по возвращении из отпуска отвечу на все Ваши накопившиеся вопросы :blush:

×
×
  • Создать...