|
|
  |
STM8 IAR ASM объявление переменных |
|
|
|
May 18 2017, 13:16
|
Группа: Новичок
Сообщений: 3
Регистрация: 6-12-13
Пользователь №: 79 520

|
Нигде не найду как на ассемблере объявить переменную в среде IAR. А также где брать подключаемые хедер файлы для портов.
Может у кого есть простая рабочая программка на асме под stm8 в среде IAR?
|
|
|
|
|
May 18 2017, 13:24
|
Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Jun 8 2017, 14:13
|
Группа: Новичок
Сообщений: 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
|
|
|
|
|
Jun 8 2017, 14:33
|
Частый гость
 
Группа: Участник
Сообщений: 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 ' Регистр команд '
Синтаксис скорее определяется используемой средой, чем платформой. В секции, предназначенной для размещения кода, невозможно разместить переменные. А различия в объявлении должны быть понятны из примера.
|
|
|
|
|
Jun 9 2017, 06:40
|
Группа: Новичок
Сообщений: 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"
|
|
|
|
|
Jun 9 2017, 07:41
|

Знающий
   
Группа: Участник
Сообщений: 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
--------------------
Пролетарий умственного труда.
|
|
|
|
|
Jun 12 2017, 05:23
|
Частый гость
 
Группа: Участник
Сообщений: 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
|
|
|
|
|
Jun 14 2017, 13:30
|
Профессионал
    
Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848

|
Цитата(jcxz @ Jun 12 2017, 20:34)  Возьмите любой си-шный исходник, найдите в свойствах проекта галку "генерировать asm-файлы", скомпилите и изучите результат. Я так делал себе "шаблон" для функции на ASM. Как альтернатива - в каталоге, где установлен IAR, поискать файлы с расширением ASM (для конкретного процессора) Там может быть каталог \tutor\ - приведены примеры проектов с ASM а также исходники функций (на ASM), содержащихся в библиотеках C, например ldiv (по крайней мере для IAR/MSP430 ОНО есть).
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|