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

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Микроконтроллеры » Архив » Для обсуждения ассемблера в МК с Cortex-M3


Для обсуждения ассемблера в МК с Cortex-M3

Сообщений 1 страница 30 из 35

1

Начал изучать асм для кортексов. Наткнулся на такую особенность команды вида:

Код:
    ldrb         r1, [r0, #offset]
    strb         r1, [r0, #offset]

некорректно работают при #offset с отрицательным нечетным значением. Читает непонятно что и откуда, пишет тоже непонятно куда.

2

ААА этот ассемблер,мозг не хочет воспринимать после Си :)

3

Ну начни с изучения стартапа + скрипт линкера, многое сразу станет понятным, что зачем и как происходит. Да система команд по сравнению с АВР очень крутая, а с ПИК то вобще...

4

Но я и смотрю в одной простой команде на ассеме вставлена сразу куча за раз. Тот же например копирование нескольких регистров за раз или команда с копирование и пост инкрементом или декрементом адреса назначения или считывая...

Подскажите для чего выделяется размер кучи heap ? размер стека тока выделяется в оперативной памяти,правда не пойму как в при включении она инициализируется ,точку останова не могу поставить в дебаге.
Еще бы кто по шагам объяснил как проиходит инициализация стека и т д, до вызова SystemInit.

Код:
;******************** (C) COPYRIGHT 2011 STMicroelectronics ********************
;* File Name          : startup_stm32f10x_md.s
;* Author             : MCD Application Team
;* Version            : V3.5.0
;* Date               : 11-March-2011
;* Description        : STM32F10x Medium Density Devices vector table for MDK-ARM 
;*                      toolchain.  
;*                      This module performs:
;*                      - Set the initial SP
;*                      - Set the initial PC == Reset_Handler
;*                      - Set the vector table entries with the exceptions ISR address
;*                      - Configure the clock system
;*                      - Branches to __main in the C library (which eventually
;*                        calls main()).
;*                      After Reset the CortexM3 processor is in Thread mode,
;*                      priority is Privileged, and the Stack is set to Main.
;* <<< Use Configuration Wizard in Context Menu >>>   
;*******************************************************************************
; THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
; WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
; AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
; INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
; CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
; INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
;*******************************************************************************

; Amount of memory (in bytes) allocated for Stack
; Tailor this value to your application needs
; <h> Stack Configuration
;   <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>

Stack_Size      EQU     0x00000400

                AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size
__initial_sp


; <h> Heap Configuration
;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>

Heap_Size       EQU     0x00000200

                AREA    HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem        SPACE   Heap_Size
__heap_limit

                PRESERVE8
                THUMB


; Vector Table Mapped to Address 0 at Reset
                AREA    RESET, DATA, READONLY
                EXPORT  __Vectors
                EXPORT  __Vectors_End
                EXPORT  __Vectors_Size

__Vectors       DCD     __initial_sp               ; Top of Stack
                DCD     Reset_Handler              ; Reset Handler
                DCD     NMI_Handler                ; NMI Handler
                DCD     HardFault_Handler          ; Hard Fault Handler
                DCD     MemManage_Handler          ; MPU Fault Handler
                DCD     BusFault_Handler           ; Bus Fault Handler
                DCD     UsageFault_Handler         ; Usage Fault Handler
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     SVC_Handler                ; SVCall Handler
                DCD     DebugMon_Handler           ; Debug Monitor Handler
                DCD     0                          ; Reserved
                DCD     PendSV_Handler             ; PendSV Handler
                DCD     SysTick_Handler            ; SysTick Handler

                ; External Interrupts
                DCD     WWDG_IRQHandler            ; Window Watchdog
                DCD     PVD_IRQHandler             ; PVD through EXTI Line detect
                DCD     TAMPER_IRQHandler          ; Tamper
                DCD     RTC_IRQHandler             ; RTC
                DCD     FLASH_IRQHandler           ; Flash
                DCD     RCC_IRQHandler             ; RCC
                DCD     EXTI0_IRQHandler           ; EXTI Line 0
                DCD     EXTI1_IRQHandler           ; EXTI Line 1
                DCD     EXTI2_IRQHandler           ; EXTI Line 2
                DCD     EXTI3_IRQHandler           ; EXTI Line 3
                DCD     EXTI4_IRQHandler           ; EXTI Line 4
                DCD     DMA1_Channel1_IRQHandler   ; DMA1 Channel 1
                DCD     DMA1_Channel2_IRQHandler   ; DMA1 Channel 2
                DCD     DMA1_Channel3_IRQHandler   ; DMA1 Channel 3
                DCD     DMA1_Channel4_IRQHandler   ; DMA1 Channel 4
                DCD     DMA1_Channel5_IRQHandler   ; DMA1 Channel 5
                DCD     DMA1_Channel6_IRQHandler   ; DMA1 Channel 6
                DCD     DMA1_Channel7_IRQHandler   ; DMA1 Channel 7
                DCD     ADC1_2_IRQHandler          ; ADC1_2
                DCD     USB_HP_CAN1_TX_IRQHandler  ; USB High Priority or CAN1 TX
                DCD     USB_LP_CAN1_RX0_IRQHandler ; USB Low  Priority or CAN1 RX0
                DCD     CAN1_RX1_IRQHandler        ; CAN1 RX1
                DCD     CAN1_SCE_IRQHandler        ; CAN1 SCE
                DCD     EXTI9_5_IRQHandler         ; EXTI Line 9..5
                DCD     TIM1_BRK_IRQHandler        ; TIM1 Break
                DCD     TIM1_UP_IRQHandler         ; TIM1 Update
                DCD     TIM1_TRG_COM_IRQHandler    ; TIM1 Trigger and Commutation
                DCD     TIM1_CC_IRQHandler         ; TIM1 Capture Compare
                DCD     TIM2_IRQHandler            ; TIM2
                DCD     TIM3_IRQHandler            ; TIM3
                DCD     TIM4_IRQHandler            ; TIM4
                DCD     I2C1_EV_IRQHandler         ; I2C1 Event
                DCD     I2C1_ER_IRQHandler         ; I2C1 Error
                DCD     I2C2_EV_IRQHandler         ; I2C2 Event
                DCD     I2C2_ER_IRQHandler         ; I2C2 Error
                DCD     SPI1_IRQHandler            ; SPI1
                DCD     SPI2_IRQHandler            ; SPI2
                DCD     USART1_IRQHandler          ; USART1
                DCD     USART2_IRQHandler          ; USART2
                DCD     USART3_IRQHandler          ; USART3
                DCD     EXTI15_10_IRQHandler       ; EXTI Line 15..10
                DCD     RTCAlarm_IRQHandler        ; RTC Alarm through EXTI Line
                DCD     USBWakeUp_IRQHandler       ; USB Wakeup from suspend
__Vectors_End

__Vectors_Size  EQU  __Vectors_End - __Vectors

                AREA    |.text|, CODE, READONLY

; Reset handler
Reset_Handler    PROC
                 EXPORT  Reset_Handler             [WEAK]
     IMPORT  __main
     IMPORT  SystemInit
                 LDR     R0, =SystemInit
                 BLX     R0
                 LDR     R0, =__main
                 BX      R0
                 ENDP

; Dummy Exception Handlers (infinite loops which can be modified)

NMI_Handler     PROC
                EXPORT  NMI_Handler                [WEAK]
                B       .
                ENDP
HardFault_Handler\
                PROC
                EXPORT  HardFault_Handler          [WEAK]
                B       .
                ENDP
MemManage_Handler\
                PROC
                EXPORT  MemManage_Handler          [WEAK]
                B       .
                ENDP
BusFault_Handler\
                PROC
                EXPORT  BusFault_Handler           [WEAK]
                B       .
                ENDP
UsageFault_Handler\
                PROC
                EXPORT  UsageFault_Handler         [WEAK]
                B       .
                ENDP
SVC_Handler     PROC
                EXPORT  SVC_Handler                [WEAK]
                B       .
                ENDP
DebugMon_Handler\
                PROC
                EXPORT  DebugMon_Handler           [WEAK]
                B       .
                ENDP
PendSV_Handler  PROC
                EXPORT  PendSV_Handler             [WEAK]
                B       .
                ENDP
SysTick_Handler PROC
                EXPORT  SysTick_Handler            [WEAK]
                B       .
                ENDP

Default_Handler PROC

                EXPORT  WWDG_IRQHandler            [WEAK]
                EXPORT  PVD_IRQHandler             [WEAK]
                EXPORT  TAMPER_IRQHandler          [WEAK]
                EXPORT  RTC_IRQHandler             [WEAK]
                EXPORT  FLASH_IRQHandler           [WEAK]
                EXPORT  RCC_IRQHandler             [WEAK]
                EXPORT  EXTI0_IRQHandler           [WEAK]
                EXPORT  EXTI1_IRQHandler           [WEAK]
                EXPORT  EXTI2_IRQHandler           [WEAK]
                EXPORT  EXTI3_IRQHandler           [WEAK]
                EXPORT  EXTI4_IRQHandler           [WEAK]
                EXPORT  DMA1_Channel1_IRQHandler   [WEAK]
                EXPORT  DMA1_Channel2_IRQHandler   [WEAK]
                EXPORT  DMA1_Channel3_IRQHandler   [WEAK]
                EXPORT  DMA1_Channel4_IRQHandler   [WEAK]
                EXPORT  DMA1_Channel5_IRQHandler   [WEAK]
                EXPORT  DMA1_Channel6_IRQHandler   [WEAK]
                EXPORT  DMA1_Channel7_IRQHandler   [WEAK]
                EXPORT  ADC1_2_IRQHandler          [WEAK]
                EXPORT  USB_HP_CAN1_TX_IRQHandler  [WEAK]
                EXPORT  USB_LP_CAN1_RX0_IRQHandler [WEAK]
                EXPORT  CAN1_RX1_IRQHandler        [WEAK]
                EXPORT  CAN1_SCE_IRQHandler        [WEAK]
                EXPORT  EXTI9_5_IRQHandler         [WEAK]
                EXPORT  TIM1_BRK_IRQHandler        [WEAK]
                EXPORT  TIM1_UP_IRQHandler         [WEAK]
                EXPORT  TIM1_TRG_COM_IRQHandler    [WEAK]
                EXPORT  TIM1_CC_IRQHandler         [WEAK]
                EXPORT  TIM2_IRQHandler            [WEAK]
                EXPORT  TIM3_IRQHandler            [WEAK]
                EXPORT  TIM4_IRQHandler            [WEAK]
                EXPORT  I2C1_EV_IRQHandler         [WEAK]
                EXPORT  I2C1_ER_IRQHandler         [WEAK]
                EXPORT  I2C2_EV_IRQHandler         [WEAK]
                EXPORT  I2C2_ER_IRQHandler         [WEAK]
                EXPORT  SPI1_IRQHandler            [WEAK]
                EXPORT  SPI2_IRQHandler            [WEAK]
                EXPORT  USART1_IRQHandler          [WEAK]
                EXPORT  USART2_IRQHandler          [WEAK]
                EXPORT  USART3_IRQHandler          [WEAK]
                EXPORT  EXTI15_10_IRQHandler       [WEAK]
                EXPORT  RTCAlarm_IRQHandler        [WEAK]
                EXPORT  USBWakeUp_IRQHandler       [WEAK]

WWDG_IRQHandler
PVD_IRQHandler
TAMPER_IRQHandler
RTC_IRQHandler
FLASH_IRQHandler
RCC_IRQHandler
EXTI0_IRQHandler
EXTI1_IRQHandler
EXTI2_IRQHandler
EXTI3_IRQHandler
EXTI4_IRQHandler
DMA1_Channel1_IRQHandler
DMA1_Channel2_IRQHandler
DMA1_Channel3_IRQHandler
DMA1_Channel4_IRQHandler
DMA1_Channel5_IRQHandler
DMA1_Channel6_IRQHandler
DMA1_Channel7_IRQHandler
ADC1_2_IRQHandler
USB_HP_CAN1_TX_IRQHandler
USB_LP_CAN1_RX0_IRQHandler
CAN1_RX1_IRQHandler
CAN1_SCE_IRQHandler
EXTI9_5_IRQHandler
TIM1_BRK_IRQHandler
TIM1_UP_IRQHandler
TIM1_TRG_COM_IRQHandler
TIM1_CC_IRQHandler
TIM2_IRQHandler
TIM3_IRQHandler
TIM4_IRQHandler
I2C1_EV_IRQHandler
I2C1_ER_IRQHandler
I2C2_EV_IRQHandler
I2C2_ER_IRQHandler
SPI1_IRQHandler
SPI2_IRQHandler
USART1_IRQHandler
USART2_IRQHandler
USART3_IRQHandler
EXTI15_10_IRQHandler
RTCAlarm_IRQHandler
USBWakeUp_IRQHandler

                B       .

                ENDP

                ALIGN

;*******************************************************************************
; User Stack and Heap initialization
;*******************************************************************************
                 IF      :DEF:__MICROLIB           
                
                 EXPORT  __initial_sp
                 EXPORT  __heap_base
                 EXPORT  __heap_limit
                
                 ELSE
                
                 IMPORT  __use_two_region_memory
                 EXPORT  __user_initial_stackheap
                 
__user_initial_stackheap

                 LDR     R0, =  Heap_Mem
                 LDR     R1, =(Stack_Mem + Stack_Size)
                 LDR     R2, = (Heap_Mem +  Heap_Size)
                 LDR     R3, = Stack_Mem
                 BX      LR

                 ALIGN

                 ENDIF

                 END

;******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE*****

5

CERGEI написал(а):

Еще бы кто по шагам объяснил как проиходит инициализация стека и т д, до вызова SystemInit.

В Programmer Manual, кажется, описанно.

При старте СТМок первое, что делает сам Микроконтроллер, берет первые 4е байта по адресу старта (если из флеша стартует, то по 0x08000000, если из СРАМа, то по 0x20000000) и запихивает их в регистр SP. И хоп, стек инициализрованн :)
Т.е. все что надо сделать погромисту, это правильно разместить этот адресок по адресу 0x08000000:

Код:
__attribute__ ( ( used, section( ".isr_vector" ) ) )
void ( * const g_pfnVectors[] )( void ) =
{
    /*----------Core Exceptions------------------------------------------------ */
    ( void * ) & _co_stack,    /*!< The initial stack pointer         */
    Reset_Handler,             /*!< Reset Handler                               */
    NMI_Handler,               /*!< NMI Handler                                 */
    HardFault_Handler,         /*!< Hard Fault Handler                          */
    MemManage_Handler,         /*!< MPU Fault Handler                           */
    BusFault_Handler,          /*!< Bus Fault Handler                           */
    UsageFault_Handler,        /*!< Usage Fault Handler                         */
    0, 0, 0, 0,                /*!< Reserved                                    */
    SVC_Handler,               /*!< SVCall Handler                              */
    DebugMon_Handler,          /*!< Debug Monitor Handler                       */
    0,                         /*!< Reserved                                    */
    PendSV_Handler,            /*!< PendSV Handler                              */
    SysTick_Handler,           /*!< SysTick Handler                             */

    /*----------External Exceptions---------------------------------------------*/
    WWDG_IRQHandler,                /*!<  0: Window WatchDog                         */
    PVD_IRQHandler,                 /*!<  1: PVD th
.....

Кстати, в Programmer Manual много чего интересного написано, помимо Reference Manual. Иногда полезно почитать. Правда не всегда вспоминаю об этом.

Отредактировано MasterAlexei (2019-01-23 09:28:24)

6

Благодарю почитаю Programmer Manua,сама то.

7

Но в таких классных с точки зрения периферии F0 асм урезан до минимума((

Попробую рассказать:
границы памяти секторов определяет линкер для этого в скрипте линкера можно создавать переменные.

Код:
; Vector Table Mapped to Address 0 at Reset
                AREA    RESET, DATA, READONLY
                EXPORT  __Vectors
                EXPORT  __Vectors_End
                EXPORT  __Vectors_Size

__Vectors       DCD     __initial_sp               ; Top of Stack
                DCD     Reset_Handler              ; Reset Handler
                DCD     NMI_Handler                ; NMI Handler
                DCD     HardFault_Handler          ; Hard Fault Handler
                DCD     MemManage_Handler          ; MPU Fault Handler
                DCD     BusFault_Handler           ; Bus Fault Handler
                DCD     UsageFault_Handler         ; Usage Fault Handler
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     SVC_Handler                ; SVCall Handler
                DCD     DebugMon_Handler           ; Debug Monitor Handler
                DCD     0                          ; Reserved
                DCD     PendSV_Handler             ; PendSV Handler
                DCD     SysTick_Handler            ; SysTick Handler

                ; External Interrupts
                DCD     WWDG_IRQHandler            ; Window Watchdog
                DCD     PVD_IRQHandler             ; PVD through EXTI Line detect
                DCD     TAMPER_IRQHandler          ; Tamper
                DCD     RTC_IRQHandler             ; RTC
                DCD     FLASH_IRQHandler           ; Flash
                DCD     RCC_IRQHandler             ; RCC
                DCD     EXTI0_IRQHandler           ; EXTI Line 0
                DCD     EXTI1_IRQHandler           ; EXTI Line 1
                DCD     EXTI2_IRQHandler           ; EXTI Line 2
                DCD     EXTI3_IRQHandler           ; EXTI Line 3
                DCD     EXTI4_IRQHandler           ; EXTI Line 4
                DCD     DMA1_Channel1_IRQHandler   ; DMA1 Channel 1
                DCD     DMA1_Channel2_IRQHandler   ; DMA1 Channel 2
                DCD     DMA1_Channel3_IRQHandler   ; DMA1 Channel 3
                DCD     DMA1_Channel4_IRQHandler   ; DMA1 Channel 4
                DCD     DMA1_Channel5_IRQHandler   ; DMA1 Channel 5
                DCD     DMA1_Channel6_IRQHandler   ; DMA1 Channel 6
                DCD     DMA1_Channel7_IRQHandler   ; DMA1 Channel 7
                DCD     ADC1_2_IRQHandler          ; ADC1_2
                DCD     USB_HP_CAN1_TX_IRQHandler  ; USB High Priority or CAN1 TX
                DCD     USB_LP_CAN1_RX0_IRQHandler ; USB Low  Priority or CAN1 RX0
                DCD     CAN1_RX1_IRQHandler        ; CAN1 RX1
                DCD     CAN1_SCE_IRQHandler        ; CAN1 SCE
                DCD     EXTI9_5_IRQHandler         ; EXTI Line 9..5
                DCD     TIM1_BRK_IRQHandler        ; TIM1 Break
                DCD     TIM1_UP_IRQHandler         ; TIM1 Update
                DCD     TIM1_TRG_COM_IRQHandler    ; TIM1 Trigger and Commutation
                DCD     TIM1_CC_IRQHandler         ; TIM1 Capture Compare
                DCD     TIM2_IRQHandler            ; TIM2
                DCD     TIM3_IRQHandler            ; TIM3
                DCD     TIM4_IRQHandler            ; TIM4
                DCD     I2C1_EV_IRQHandler         ; I2C1 Event
                DCD     I2C1_ER_IRQHandler         ; I2C1 Error
                DCD     I2C2_EV_IRQHandler         ; I2C2 Event
                DCD     I2C2_ER_IRQHandler         ; I2C2 Error
                DCD     SPI1_IRQHandler            ; SPI1
                DCD     SPI2_IRQHandler            ; SPI2
                DCD     USART1_IRQHandler          ; USART1
                DCD     USART2_IRQHandler          ; USART2
                DCD     USART3_IRQHandler          ; USART3
                DCD     EXTI15_10_IRQHandler       ; EXTI Line 15..10
                DCD     RTCAlarm_IRQHandler        ; RTC Alarm through EXTI Line
                DCD     USBWakeUp_IRQHandler       ; USB Wakeup from suspend
__Vectors_End

__Vectors_Size  EQU  __Vectors_End - __Vectors

ну это понятно. Таблица векторов прерывания.

Код:
; Reset handler
Reset_Handler    PROC
                 EXPORT  Reset_Handler             [WEAK]
     IMPORT  __main
     IMPORT  SystemInit
                 LDR     R0, =SystemInit
                 BLX     R0
                 LDR     R0, =__main
                 BX      R0
                 ENDP

этот код это начало программы Reset_Handler (вектор сброса) тут тоже все просто вначале вызов SystemInit, потом уже переход в программу пользователя __main

Код:
; Dummy Exception Handlers (infinite loops which can be modified)

NMI_Handler     PROC
                EXPORT  NMI_Handler                [WEAK]
                B       .
                ENDP
HardFault_Handler\
                PROC
                EXPORT  HardFault_Handler          [WEAK]
                B       .
                ENDP
MemManage_Handler\
                PROC
                EXPORT  MemManage_Handler          [WEAK]
                B       .
                ENDP
BusFault_Handler\
                PROC
                EXPORT  BusFault_Handler           [WEAK]
                B       .
                ENDP
UsageFault_Handler\
                PROC
                EXPORT  UsageFault_Handler         [WEAK]
                B       .
                ENDP
SVC_Handler     PROC
                EXPORT  SVC_Handler                [WEAK]
                B       .
                ENDP
DebugMon_Handler\
                PROC
                EXPORT  DebugMon_Handler           [WEAK]
                B       .
                ENDP
PendSV_Handler  PROC
                EXPORT  PendSV_Handler             [WEAK]
                B       .
                ENDP
SysTick_Handler PROC
                EXPORT  SysTick_Handler            [WEAK]
                B       .
                ENDP

Default_Handler PROC

                EXPORT  WWDG_IRQHandler            [WEAK]
                EXPORT  PVD_IRQHandler             [WEAK]
                EXPORT  TAMPER_IRQHandler          [WEAK]
                EXPORT  RTC_IRQHandler             [WEAK]
                EXPORT  FLASH_IRQHandler           [WEAK]
                EXPORT  RCC_IRQHandler             [WEAK]
                EXPORT  EXTI0_IRQHandler           [WEAK]
                EXPORT  EXTI1_IRQHandler           [WEAK]
                EXPORT  EXTI2_IRQHandler           [WEAK]
                EXPORT  EXTI3_IRQHandler           [WEAK]
                EXPORT  EXTI4_IRQHandler           [WEAK]
                EXPORT  DMA1_Channel1_IRQHandler   [WEAK]
                EXPORT  DMA1_Channel2_IRQHandler   [WEAK]
                EXPORT  DMA1_Channel3_IRQHandler   [WEAK]
                EXPORT  DMA1_Channel4_IRQHandler   [WEAK]
                EXPORT  DMA1_Channel5_IRQHandler   [WEAK]
                EXPORT  DMA1_Channel6_IRQHandler   [WEAK]
                EXPORT  DMA1_Channel7_IRQHandler   [WEAK]
                EXPORT  ADC1_2_IRQHandler          [WEAK]
                EXPORT  USB_HP_CAN1_TX_IRQHandler  [WEAK]
                EXPORT  USB_LP_CAN1_RX0_IRQHandler [WEAK]
                EXPORT  CAN1_RX1_IRQHandler        [WEAK]
                EXPORT  CAN1_SCE_IRQHandler        [WEAK]
                EXPORT  EXTI9_5_IRQHandler         [WEAK]
                EXPORT  TIM1_BRK_IRQHandler        [WEAK]
                EXPORT  TIM1_UP_IRQHandler         [WEAK]
                EXPORT  TIM1_TRG_COM_IRQHandler    [WEAK]
                EXPORT  TIM1_CC_IRQHandler         [WEAK]
                EXPORT  TIM2_IRQHandler            [WEAK]
                EXPORT  TIM3_IRQHandler            [WEAK]
                EXPORT  TIM4_IRQHandler            [WEAK]
                EXPORT  I2C1_EV_IRQHandler         [WEAK]
                EXPORT  I2C1_ER_IRQHandler         [WEAK]
                EXPORT  I2C2_EV_IRQHandler         [WEAK]
                EXPORT  I2C2_ER_IRQHandler         [WEAK]
                EXPORT  SPI1_IRQHandler            [WEAK]
                EXPORT  SPI2_IRQHandler            [WEAK]
                EXPORT  USART1_IRQHandler          [WEAK]
                EXPORT  USART2_IRQHandler          [WEAK]
                EXPORT  USART3_IRQHandler          [WEAK]
                EXPORT  EXTI15_10_IRQHandler       [WEAK]
                EXPORT  RTCAlarm_IRQHandler        [WEAK]
                EXPORT  USBWakeUp_IRQHandler       [WEAK]

WWDG_IRQHandler
PVD_IRQHandler
TAMPER_IRQHandler
RTC_IRQHandler
FLASH_IRQHandler
RCC_IRQHandler
EXTI0_IRQHandler
EXTI1_IRQHandler
EXTI2_IRQHandler
EXTI3_IRQHandler
EXTI4_IRQHandler
DMA1_Channel1_IRQHandler
DMA1_Channel2_IRQHandler
DMA1_Channel3_IRQHandler
DMA1_Channel4_IRQHandler
DMA1_Channel5_IRQHandler
DMA1_Channel6_IRQHandler
DMA1_Channel7_IRQHandler
ADC1_2_IRQHandler
USB_HP_CAN1_TX_IRQHandler
USB_LP_CAN1_RX0_IRQHandler
CAN1_RX1_IRQHandler
CAN1_SCE_IRQHandler
EXTI9_5_IRQHandler
TIM1_BRK_IRQHandler
TIM1_UP_IRQHandler
TIM1_TRG_COM_IRQHandler
TIM1_CC_IRQHandler
TIM2_IRQHandler
TIM3_IRQHandler
TIM4_IRQHandler
I2C1_EV_IRQHandler
I2C1_ER_IRQHandler
I2C2_EV_IRQHandler
I2C2_ER_IRQHandler
SPI1_IRQHandler
SPI2_IRQHandler
USART1_IRQHandler
USART2_IRQHandler
USART3_IRQHandler
EXTI15_10_IRQHandler
RTCAlarm_IRQHandler
USBWakeUp_IRQHandler

                B       .

                ENDP

                ALIGN

тут вначале функции заглушки для системных исключений, потом большая заглушка на все прерывания (со слабым привязыванием для возможности перекрытия пользовательским обработчиком прерывания). Асм не такой немного как у GCC, непривычный для меня.

  Что интересно я не увидел где инициализируются секции .data и .bss (в .data переменные в СОЗУ которые инициализированы (переносяться из флеш памяти), в .bss переменные не инициализированы в программе (просто обнуляються в соответствии с правилами Си)).

  Просматривая листинги многое становиться понятным, структура функций, как происходит обращение к данным. Например кортексы не поддерживают абсолютную адресацию, поэтому один и тот же код может выполняться в разном адресном пространстве. И полезно также знать что вызовы функций на Си происходит по стогому правилу - передача параметров производиться через регистры R0-R3, возвращаемое значение через R0. Если параметров больше передача идет через стек. В той книге что вы читаете все есть, благодаря ей я и научился асму) ну и смог написать диспетчер задач.

8

CERGEI написал(а):

Благодарю почитаю Programmer Manua,сама то.

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

Да вот видишь в таблице первые 2 слова это:

Код:
__Vectors       DCD     __initial_sp               ; Top of Stack
                DCD     Reset_Handler              ; Reset Handler

9

Не вижу где происходит вызов __initial_sp и зачем нужна куча эта ? понимаю стек для чего, читаю книгу когда успеваю. Но вопросы задаю.

10

__initial_sp это адрес верхушки стека, этот адрес пишеться в самом начале программы перед таблицей векторов. Стек в кортесах убывающий т.е. при заполнении адрес уменьшаеться, а данные пользователя наоборот внизу памяти ОЗУ и когда стека не хватает то начинаються затираться данные пользователя и потом крах системы))

__Vectors       DCD     __initial_sp               ; Top of Stack
                     DCD     Reset_Handler              ; Reset Handler

куча нужна для динамического выделения памяти (malloc и т.д.), т.е. это область между данными пользователя и стеком. По сути просто свободная память, я например не использую кучу и ставлю размер кучи ноль, можно просто задать минимальный размер кучи чтобы выскочило предупреждение.

11

Вот теперь что то понятно,хорошо дальше читаем полезную книгу )

12

про стек и кучу HardFault_Handler/ sprintf/ stm32f103 хорошо пояснено.

13

да нафиг эта куча, malloc  не использую.

14

CERGEI написал(а):

да нафиг эта куча, malloc  не использую.

ну да, там же больше не о чем и не говорится...

15

Также асем с кейлом Ссылка

16

Кому-то нех... было делать) смысл инициализировать периферию на асме.

17

Тренировка как оно работает... :)

18

Кстати насчёт стартапа и асма
Есть у меня идея - кодогенератор расширенного стартапа на базе стартапа из дистрибутива gcc-arm-none-eabi
С включением туда инициализации и базовых ф-ций для работы с периферией
Цель - возможность немедленно начать работать с мк без какого-либо доп софта кроме дистрибутива gcc
И без разборок с IDE, RM и т.п.

Закон Парето в приложении к эмбеду - 20% возможностей мк покрывают 80% потребностей )

Отредактировано vt (2019-01-24 23:17:53)

19

Вот у меня тоже была такая идея, даже можно просто взять проект с куба (там текстовый файлик), и на основе его генерировать. Написать быстрые функции на асме (или выдрать из листа) для стандартной инициализации и останеться только менять константы, ну и иметь несколько вариаций реализации для одной задачи. И на основе этой же идеи родилась идея сделать подобие ПЛК (банальный перебор функций с параметрами во флешке).
Таким же образом я сейчас делаю диспетчер задач, добиваюсь того чтобы ОС состояла просто из бинарника, который прикручиваеться в стартапе. Туда же со временем запихну бутлоадер.

20

Вы идете в обратную сторону прогресса :) Думаю ассем нужно знать,но кодить на нем это уже тяжко.Да и переносимость кода на ассеме ? в жизни все меняется и нужно без потерь переходить на другой кристалл. 
Зачем придумали субприоритеты для прерываний,разве не хватает приоритета группы.... грызу книжку про ядро продолжаю :)

21

CERGEI написал(а):

Вы идете в обратную сторону прогресса :)

К прогрессу развлечения с мк имеют примерно такое же отношение как квадрики с алиэкспресса к авиации )

22

Если на асме писать только на ядро, то переносимость будет 100% на все Кортексы М3, также будет работать и на М4, М7 если без FPU. А так переносимость такая же как и на Си. Если рассуждать в рамках написания кодогенератора, то есть смысл писать даже на асме экономя по несколько байт. Я не спорю что писать все приложение на асме это тупо, но кусочки критические к скорости вполне можно. Ну и самое главное Си не охватывает всех возможностей ядра и систему команд, поэтому и придумали CMSIS. Не знаю как другие компиляторы, но мне показалось что GCC не шибко использует все возможности системы команд все как-то просто и стандартно.
   Можно написать хороший признанный всеми кодогенератор и дарить его окружающим)) Потом возможно ст купит его за много денег.

23

CERGEI Причем тут приоритеты к асму? Писать можно, но зачем писать на нем все. Хорошо ориентироваться в асме обязаны все программисты, а то слишком много вопросов у людей поставил высокую оптимизацию и все не работает код, а заглянуть в асм знаний нет, вот и чешут репу.
Ну и писать на асме просто увлекательно. Вот например для работы с маленькими списками удобно использовать команду CLZ, погляди что она делает и ее ты не найдешь в листингах на си.

24

Ну и еще в рамках кодогенератора можно менять не только блок констант, но и мнемоники самих инструкций. Есть инструкции которые хоршо работают со статическими данными BFC, BFI.

25

MasterElectric написал(а):

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

Для gcc:

Код:
int a = __CLZ(b);

26

Не ну так это CMSIS функция, я имел в виду что ее не встретить в обычной программе на Си.

27

MasterElectric написал(а):

Не ну так это CMSIS функция, я имел в виду что ее не встретить в обычной программе на Си.

Нужно знать где искать, CLZ должна быть во многих RTOS, потому что там это востребованная операция. Во FreeRTOS есть, правда как __builtin_clz, в Qp есть, дальше просто не проверял...

28

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

29

Reflector Для меня загадка как работать с переменными в монопольном доступе из Си программы, только через CMSIS или есть какие-то директивы и можно пометить переменную и компилятор сам все сделает.

30

MasterElectric написал(а):

Для меня загадка как работать с переменными в монопольном доступе из Си программы, только через CMSIS или есть какие-то директивы и можно пометить переменную и компилятор сам все сделает.

Не совсем понятно что именно ты хочешь сделать.


Вы здесь » Микроконтроллеры » Архив » Для обсуждения ассемблера в МК с Cortex-M3