реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> STM8 IAR ASM объявление переменных
draft3
сообщение May 18 2017, 13:16
Сообщение #1





Группа: Новичок
Сообщений: 3
Регистрация: 6-12-13
Пользователь №: 79 520



Нигде не найду как на ассемблере объявить переменную в среде IAR.
А также где брать подключаемые хедер файлы для портов.

Может у кого есть простая рабочая программка на асме под stm8 в среде IAR?
Go to the top of the page
 
+Quote Post
megajohn
сообщение May 18 2017, 13:24
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



это ?


--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post
scifi
сообщение May 18 2017, 13:24
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Я делал вот так:
CODE
module i2c

section .near_func.text:CODE:NOROOT(0)

extern ?b0

public i2c_readbyte
public i2c_readword
public i2c_writebyte

PA_ODR define 0x5000
PA_IDR define 0x5001

set_sda macro
bset PA_ODR, #2
endm

clear_sda macro
bres PA_ODR, #2
endm

set_scl macro
bset PA_ODR, #1
endm

clear_scl macro
bres PA_ODR, #1
endm

write_bit macro
sll A
bccm PA_ODR, #2
set_scl
nop
nop
nop
clear_scl
endm

read_bit macro
set_scl
nop
ld A, #4
and A, L:PA_IDR
clear_scl
add A, #255
rlcw X
nop
nop
endm

start macro
clear_sda
clear_scl
endm

stop macro
clear_sda
set_scl
set_sda
endm

write_byte:
write_bit
write_bit
write_bit
write_bit
write_bit
write_bit
write_bit
write_bit
set_sda
nop
nop
set_scl
nop
nop
nop
clear_scl
ret

read_byte:
set_sda
read_bit
read_bit
read_bit
read_bit
read_bit
read_bit
read_bit
read_bit
clear_sda
set_scl
nop
clear_scl
ret

read_byte_nack:
set_sda
read_bit
read_bit
read_bit
read_bit
read_bit
read_bit
read_bit
read_bit
set_sda
set_scl
nop
clear_scl
ret

i2c_readbyte:
push A
start
ld A, #0xC0
call write_byte
pop A
call write_byte
stop
nop
nop
nop
start
ld A, #0xC1
call write_byte
call read_byte_nack
stop
rrwa X, A
ret

i2c_readword:
push A
start
ld A, #0xC0
call write_byte
pop A
call write_byte
stop
nop
nop
nop
start
ld A, #0xC1
call write_byte
call read_byte
call read_byte_nack
stop
ret

i2c_writebyte:
push A
start
ld A, #0xC0
call write_byte
pop A
call write_byte
ld A, ?b0
call write_byte
stop
ret

end
Go to the top of the page
 
+Quote Post
draft3
сообщение Jun 8 2017, 14:13
Сообщение #4





Группа: Новичок
Сообщений: 3
Регистрация: 6-12-13
Пользователь №: 79 520



Я читал "IAR Assembler Reference Guide" пытался брать те куски кода которые там приводились но все никак не получается...
особенно непонятно как правильно пользоваться директивой SECTION.
Я так понимаю что нужно обьявить секцию для переменных сначала?
Так значение переменной не меняется:

Код
#include "iostm8.h"
        MODULE  asmmain
        PUBLIC  __iar_program_start
        PUBLIC  main
        EXTERN  CSTACK$$Limit
    
        SECTION `.near_func.text`:CODE//начинается секция кода программ, что там в кавычках?

__iar_program_start:
a1      DC16 0 //двухбайтная переменная инициализируется значением 0
a2      DC16 9 //двухбайтная переменная инициализируется значением 9  
        LDW     X, #0x000600    ; Set stackpointer
        LDW     SP, X
main:  

        LD A,#5//загружаю в А число 5
        LD a1,A// загружаю в переменную a1 значение из А

      END
Go to the top of the page
 
+Quote Post
amiller
сообщение Jun 8 2017, 14:33
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 176
Регистрация: 20-02-14
Из: Томск
Пользователь №: 80 612



Цитата(draft3 @ Jun 8 2017, 18:13) *
Я читал "IAR Assembler Reference Guide" пытался брать те куски кода которые там приводились но все никак не получается...
особенно непонятно как правильно пользоваться директивой SECTION.
Я так понимаю что нужно обьявить секцию для переменных сначала?
Так значение переменной не меняется:

Код
#include "iostm8.h"
        MODULE  asmmain
        PUBLIC  __iar_program_start
        PUBLIC  main
        EXTERN  CSTACK$$Limit
    
        SECTION `.near_func.text`:CODE//начинается секция кода программ, что там в кавычках?

__iar_program_start:
a1      DC16 0 //двухбайтная переменная инициализируется значением 0
a2      DC16 9 //двухбайтная переменная инициализируется значением 9  
        LDW     X, #0x000600; Set stackpointer
        LDW     SP, X
main:  

        LD A,#5//загружаю в А число 5
        LD a1,A// загружаю в переменную a1 значение из А

      END

По моему у Вас всё перепутано.
Вот фрагмент кода, ассемблер редко приходится использовать:
CODE
//-------------------------------------------ПЕРЕМЕННЫЕ---------------------------------------------
SECTION `.noinit`:DATA:NOROOT(2)
DATA
D_NUM DS16 1 ; Серийный номер
D_DAT DS16 1 ; Дата выпуска
dummy DS16 2

//-------------------------------------------КОНСТАНТЫ----------------------------------------------
SECTION `.rodata`:CONST:NOROOT(2)
DATA
;---------------------------------------------------------------------------------------------------
sys_param:
DC16 0, 9999, 1234, 0x90 + T_DEC + F_EXT + F_WRT
DC8 ' Регистр команд '

Синтаксис скорее определяется используемой средой, чем платформой.
В секции, предназначенной для размещения кода, невозможно разместить переменные.
А различия в объявлении должны быть понятны из примера.
Go to the top of the page
 
+Quote Post
draft3
сообщение Jun 9 2017, 06:40
Сообщение #6





Группа: Новичок
Сообщений: 3
Регистрация: 6-12-13
Пользователь №: 79 520



Так компилируется:
Код
#include "iostm8.h"
        MODULE  asmmain
        PUBLIC  __iar_program_start
        PUBLIC  main
        EXTERN  CSTACK$$Limit
//-------------------------------------------ПЕРЕМЕННЫЕ---------------------------------------------
    SECTION `.noinit`:DATA:NOROOT(2)
    DATA//это зачем? работает и без нее.
D_NUM        DC8        1                    ; Серийный номер
D_DAT        DC8        1                    ; Дата выпуска
dummy        DC8        2
        SECTION `.near_func.text`:CODE//начинается секция кода программ, что там в кавычках?

__iar_program_start:

        LDW     X, #0x000600    ; Set stackpointer
        LDW     SP, X
main:  

        LD A,#5//загружаю в А число 5
        //LD D_NUM,A// загружаю в переменную a1 значение из А

      END

Но если раскомментировать "//LD D_NUM,A// загружаю в переменную a1 значение из А"
то пишет ошибку:
Error[Lc036]: no block or place matches the pattern "rw data section .noinit in asmmain.o"
Go to the top of the page
 
+Quote Post
Obam
сообщение Jun 9 2017, 07:41
Сообщение #7


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Цитата(draft3 @ Jun 9 2017, 10:40) *
Так компилируется:
Код
    DATA//это зачем? работает и без нее.
D_NUM        DC8        1        ; Серийный номер
D_DAT        DC8        1        ; Дата выпуска
dummy        DC8        2

Это от единообразия IAR-a: у Кортексов-М, если не сказать заветное слово "DATA", то в заказанных константах младший бит будет установлен в единицу.

Сообщение отредактировал Obam - Jun 9 2017, 07:42


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
amiller
сообщение Jun 12 2017, 05:23
Сообщение #8


Частый гость
**

Группа: Участник
Сообщений: 176
Регистрация: 20-02-14
Из: Томск
Пользователь №: 80 612



Цитата(draft3 @ Jun 9 2017, 10:40) *
Error[Lc036]: no block or place matches the pattern "rw data section .noinit in asmmain.o"

Это же был просто пример.
У меня в файле *.icf объявлена секция ".noinit", в которой и размещаются эти переменные. У Вас видимо этой секции нет.
Размещайте переменные в существующей секции.
По поводу ключевых слов DATA и CODE - я всегда явно указываю, что размещаю: данные (переменные или константы в зависимости от секции) или код программы.
Возможно где то это и не обязательно, но и вроде как не мешает.

Сообщение отредактировал amiller - Jun 12 2017, 05:27
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 12 2017, 17:34
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(draft3 @ Jun 9 2017, 08:40) *
Но если раскомментировать "//LD D_NUM,A// загружаю в переменную a1 значение из А"
то пишет ошибку:

Возьмите любой си-шный исходник, найдите в свойствах проекта галку "генерировать asm-файлы", скомпилите и изучите результат.
Go to the top of the page
 
+Quote Post
k155la3
сообщение Jun 14 2017, 13:30
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(jcxz @ Jun 12 2017, 20:34) *
Возьмите любой си-шный исходник, найдите в свойствах проекта галку "генерировать asm-файлы", скомпилите и изучите результат.

Я так делал себе "шаблон" для функции на ASM.

Как альтернатива - в каталоге, где установлен IAR, поискать файлы с расширением ASM (для конкретного процессора)
Там может быть каталог \tutor\ - приведены примеры проектов с ASM
а также исходники функций (на ASM), содержащихся в библиотеках C, например ldiv (по крайней мере для IAR/MSP430 ОНО есть).
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 15 2017, 04:31
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(k155la3 @ Jun 14 2017, 15:30) *
Как альтернатива - в каталоге, где установлен IAR, поискать файлы с расширением ASM (для конкретного процессора)

... и ничего не найти biggrin.gif
так как файлы ассемблера в IAR по дефолту имеют расширение .s
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 5th July 2025 - 19:43
Рейтинг@Mail.ru


Страница сгенерированна за 0.01479 секунд с 7
ELECTRONIX ©2004-2016