Отговори на тема  [ 9 мнения ] 
IAR+MSP430+Assembly 
Автор Съобщение
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Съб Юни 09, 2012 12:23 am
Мнения: 146
Местоположение: София/Стара Загора
Мнение IAR+MSP430+Assembly
Реших да се захвана поне с един асемблер на една фамилия както трябва. Избрал съм MSP-то. Викам ще разгледам малко пък за седмица -две ще го загрея. Първо държа да отбележа че IAR го мразя супер много, но има симулатор, и е супер понякога за 10-20 реда код. С инструкциите нямам проблем всички горе-долу го схващам,но тия асемблерски директиви ме :? . Чета "IAR Assembler ™Reference Guide for Texas Instruments’ MSP430 Microcontroller Family", но аз ли съм крив той ли не става, не знам.

Код:
#include <msp430f2272.h>
;-------------------------------------------------------------------------------
                         
;-------------------------------------------------------------------------------
             RSEG    CSTACK                  ; Define stack segment
;-------------------------------------------------------------------------------
             RSEG    CODE                  ; Assemble to Flash memory
;-------------------------------------------------------------------------------
RESET       mov.w   #SFE(CSTACK),SP         ; Initialize stackpointer
StopWDT     mov.w   #WDTPW+WDTHOLD,&WDTCTL  ; Stop WDT
SetupP1     bis.b   #001h,&P1DIR            ; P1.0 output
                                            ;
Mainloop    xor.b   #001h,&P1OUT            ; Toggle P1.0
Wait        mov.w   #050000,R15             ; Delay to R15
L1          dec.w   R15                     ; Decrement R15
            jnz     L1                      ; Delay over?
            jmp     Mainloop                ; Again
                                            ;
;-------------------------------------------------------------------------------
            COMMON  INTVEC                  ; Interrupt Vectors
;-------------------------------------------------------------------------------
            ORG     RESET_VECTOR            ; POR, ext. Reset
            DW      RESET
            END

RSEG CSTACK
RSEG- Begins a relocatable segment !?! Това всичко в сегмента ли го бута, или сегмента се загражда от следващият RSEG CODE. Друго то RSEG си иска число значи в CODE и CSTACK са дефинирани някъде. Къде ??
Друго си мислих да направя, но се съм сигурен какво точно да плесна на "org "
Код:
RSEG    CSTACK                  ; Define stack segment
;-------------------------------------------------------------------------------
             org    0x00FF                    ; Assemble to Flash memory
;-------------------------------------------------------------------------------
RESET       mov.w   #0x0600,SP        ; Initialize stackpointer

Не мога да разбера за какво са сложили долу модул за обслужване на прекъсвания. Tе са забранени не би трябвало да се занимавам с тях, като го махна IAR реве с думите "User error: Illegal opcode found on address 0x0"
"DW RESET" за какво е тоя сегмент. Като определението за DW "Generates 16-bit constants".В смисъл то си е RESET си е лейбъл, за пръв път чувам етикет да има стойност. И каква е магическата функция на DW, според това което пише то просто си дефинира константа, да кажем за lookup table. Знам че тук има хора дето са орали и копали с тия процесори, ще се радвам драснат 2-3 реда. Ако може без за коментари от типа "Защо ползвам IAR, MSP430 или защо точно тоя проц".


Пон Фев 03, 2014 8:08 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Ное 12, 2004 3:38 pm
Мнения: 9103
Местоположение: Chicago, IL
Мнение Re: IAR+MSP430+Assembly
polinom, не са ти ясни основни положения за контролерите, така че по-леко с мразенето, защото нямаш основа на която да стъшиш за да мразиш. Отделно пък да мразиш развойна среда ми се струва леко пресилено - би трябвало да имаш предпочитани и не предпочитани такива, ама чак пък да обичаш/мразиш :D .

DW RESET ти дефинира ресет вектора и нищо, че прекъсванията са ти забранени има още един вектор в контролерите - този за рисет. Това е адреса от който контролера тръгва като му пуснеш тока. Ако я изтриеш тая декларация линкера няма да знае къде да ти сложи началото на програмата :) . CSTACK и CODE трябва да дефинирани в линкерския файл на проекта. Не мога сега да се сетя как се казваше тоя файл, ама трябва да е някъде в проекта ти.
Научи ги тия основни положения и после дай да видим какво ще мразим/обичаме :D .


Пон Фев 03, 2014 9:28 pm
Профил
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Съб Юни 09, 2012 12:23 am
Мнения: 146
Местоположение: София/Стара Загора
Мнение Re: IAR+MSP430+Assembly
Чакай сега, аз никога не съм претендирал за тънък познавач, факта че питам го доказва. Исках много да се занимавам с embedded, но просто започнах работа в друга сфера, за сега нивото ми е на хоби ентусиаст, просто гледам да не ръждясвам. В случая аз проблем с контролера нямам, IAR-a за съм го пипал за пръв и последен път преди 3 години за 1 час.
Преди време в университета имахме вземане даване с MSP430g2231. Кода правеше същото но беше в пъти по-елементарен. ORG <adsress> кода след него и сега като го видях тоя пример, с тия директиви супер ме обърка, иначе да ресет вектора забравих :oops: голям резил. И тоя CSTACK, за какво се инициализира, освен че е стекова памет. Тоя контролер няма ли си хардуерен такъв ? В картата на паметта Main: code memory 0FFFFh-08000h. По начина по който са ми показали излиза, без да инициализирам CSTACK, ORG 0x8000 и кода върви, но когато стека е създаден за да използвам ORG иска се да се измести ,в моя случай org 0x0394, ми върши работа. Явно CODE и CSTACK сe изчисляват по време на линкаването, и линкера явно си знае какво да прави, как, къде и колко да задели. Сега видях че стака може да се променя, в моя случай е 80 и 80 heap. И в края на деня остава големият въпрос " DW RESET" как процедира, тъй като описанието на директивата от 2 реда е следното "Use DC8, DC16, DC24, DC32, DF32, or DF64to create a constant, which means an area of bytes is reserved big enough for the constant." и нищо повече.Вярно е че по време на дебъга RESET e 16433(каквото и да значи). Мога да си го ползвам без да знам защо и да съм щастлив, но не обичам магически работещият код. Виждам че си написал че DW RESET дефинира ресет вектора, той си е дефинирам в хедърният файл, "#define RESET_VECTOR (15 * 2u)".


Последна промяна polinom на Вто Фев 04, 2014 12:01 am, променена общо 1 път



Пон Фев 03, 2014 11:55 pm
Профил
Ранг: Популярен
Ранг: Популярен

Регистриран на: Пон Мар 22, 2010 8:52 pm
Мнения: 328
Мнение Re: IAR+MSP430+Assembly
Dimitar написа:
Ако я изтриеш тая декларация линкера няма да знае къде да ти сложи началото на програмата :)


Само едно уточнение. Началото на програмата за линкера няма нищо общо с ресет вектора. Линкера ще си линкне програмата и без тази декларация. В общи линии на него ме е все тая къде са ресет векторите на процесора. Старт точката обикновено се дефинира с END директивата на асемблера. А може да се линкне програма и без старт поинт....


Пон Фев 03, 2014 11:58 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Ное 12, 2004 3:38 pm
Мнения: 9103
Местоположение: Chicago, IL
Мнение Re: IAR+MSP430+Assembly
Цитат:
А може да се линкне програма и без старт поинт....

То за моженето може и да може, ама какъв е смисъла :) .
Цитат:
Виждам че си написал че DW RESET дефинира ресет вектора, той си е дефинирам в хедърният файл, "#define RESET_VECTOR (15 * 2u)".

Тук си прав - недоглеждане от моя страна. Разбира се че "ORG RESET_VECTOR" е ресет вектора - незнам къде съм гледал предния път :).
DW RESET генерира 16 битова константа, която в случая е началото на програмата и пренасочва ресет вектора към въпросния адрес където е началото.


Вто Фев 04, 2014 2:43 am
Профил
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Съб Юни 09, 2012 12:23 am
Мнения: 146
Местоположение: София/Стара Загора
Мнение Re: IAR+MSP430+Assembly
Другия въпрос на който не можах да намеря отговор е къде се намира стака? Хардуерният ако има такъв, защото в документацията не видях да пише нещо за "hardware stack". При PIC18 си има такава дефиниция и се знае че стака е 31 нива, с 21 битови клетки, реализиран като отделна структура, но достъпен за четене/запис. При MSP430 липсва , или аз не виждам такава информация. Къде е реализиран, може ли да се достъпи, освен чрез POSH,POP или чрез MOV R7,0(SP) и MOV 2(SP),R6. Мисълта ми е от кой до кой адрес се реализира ?


Пет Фев 07, 2014 3:11 pm
Профил
Ранг: Популярен
Ранг: Популярен

Регистриран на: Пон Мар 22, 2010 8:52 pm
Мнения: 328
Мнение Re: IAR+MSP430+Assembly
Стека може да е навсякъде в адресното пространство.

RESET mov.w #SFE(CSTACK),SP ; Initialize stackpointer

Горният ред го инициализира на края на сегмента CSTACK.


Пет Фев 07, 2014 3:14 pm
Профил
Ранг: Популярен
Ранг: Популярен

Регистриран на: Пон Мар 22, 2010 8:52 pm
Мнения: 328
Мнение Re: IAR+MSP430+Assembly
Dimitar написа:
Цитат:
А може да се линкне програма и без старт поинт....

То за моженето може и да може, ама какъв е смисъла :) .
Цитат:
Виждам че си написал че DW RESET дефинира ресет вектора, той си е дефинирам в хедърният файл, "#define RESET_VECTOR (15 * 2u)".

Тук си прав - недоглеждане от моя страна. Разбира се че "ORG RESET_VECTOR" е ресет вектора - незнам къде съм гледал предния път :).
DW RESET генерира 16 битова константа, която в случая е началото на програмата и пренасочва ресет вектора към въпросния адрес където е началото.

Точно DW RESET на подходящо място дефинира ресет вектора. "ORG RESET_VECTOR" заедно с дефиницията в хедър файла само посочва "правилното" място.


Пет Фев 07, 2014 3:17 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Фев 07, 2012 11:22 pm
Мнения: 3084
Мнение Re: IAR+MSP430+Assembly
....къде се намира стака?

Където го сложиш в рама.
МСП няма нищо общо с ПИК, освен силиция и пластмасата.
Адресното пространство е едно, можеш да изпълняваш иснтрукции от рама дори -
не че ще ти се наложи.

На асемблер стека го набутваш в най-горните адреси на рама(На Си е друго, но там не го разбирам.).
Като се вика процедура - стекпойнтерът потъва към малките адреси. По принцип следиш да не ти набъбне много използвания рам - и да се презапише от стека , или стека да се инфектира от някоя променлива.
Трябва да знаеш кое къде се намира в процесора, как се променя стековия указател . Щом си си харесал ИАР - прочети как се предават параметрите и резултатите между функциите на Си - може да ти потрябва. П

Влез в папката на ИАР-а, подпапка "конфиг". Там за всеки процесор има файл. Тези числа и имена , които се чудиш откъде идват - ги има там, или в хедър файла за процесора.
На тоя етап тези предефинирани неща сигурно ще са ти от полза. По нататък можеш да ги зарежеш :-) .

Две неща за асемблера да знаеш
- в ИАР при заделяне на рам ако трябва да подравняваш на дума, на двойна дума и т.н. - ползвай ALIGN директива.
- ако имаш променлива AAA
mov #10,AAA
и
mov #10,&AAA
ще дадат един и същ резултат - променливата ще добие стойност 10.
Генерираният код обаче е различен. И ако преминеш към процесор с 20 битов адрес ,то първият ред ще се изпълнява коректно, само докато инструкцията се намира в първите 64килобайта. Т


Пет Фев 07, 2014 5:18 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 9 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 2 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни