Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Tascabile e con Android: BOOX Go 6 Gen II è diverso da tutti gli altri e-reader
Tascabile e con Android: BOOX Go 6 Gen II è diverso da tutti gli altri e-reader
BOOX Go 6 Gen II porta per la prima volta il supporto allo stilo su un e-reader da 6 pollici, affiancando 3 GB di RAM al collaudato Snapdragon 665 e un design rivisto con scocca posteriore a costolature. Su carta la proposta è interessante, ma Android 11 fuori supporto, l'assenza di un alloggiamento per il pennino e un'autonomia ridotta rispetto agli e-reader tradizionali sono i compromessi da accettare
Recensione Lenovo Idea Tab Plus: il tablet da 12 pollici che costa meno di 300 euro
Recensione Lenovo Idea Tab Plus: il tablet da 12 pollici che costa meno di 300 euro
Lenovo Idea Tab Plus prova a portare un display da 12,1 pollici 2.5K, quattro speaker Dolby Atmos e una batteria da 10.200 mAh sotto la soglia psicologica dei 300 euro, penna inclusa. Lo abbiamo usato per oltre una settimana per capire dove l'azienda ha tagliato e dove invece ha tenuto il punto
Oltre il contante e le crypto: tutto sull'Euro Digitale e la nuova sovranità monetaria europea
Oltre il contante e le crypto: tutto sull'Euro Digitale e la nuova sovranità monetaria europea
L'euro digitale è una valuta fiat che entrerà in vigore nei prossimi anni. L'obiettivo principale è quello di ridurre la dipendenza dalle piattaforme di pagamento digitali statunitensi e offrire ai cittadini un modo semplice per trasferire denaro. Anche offline, anche in maniera (pseudo)anonima
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 12-06-2006, 11:16   #1
sandro76
Junior Member
 
Iscritto dal: Jun 2006
Messaggi: 13
interrupt sh7047

Sto testando gli interrupt su una scheda con un processore SH 7047.
Il programma che ho realizzato accende l’AD converter e finita la conversione dovrebbe far avvenire un interrupt, che attiva una funzione che mediante un ciclo infinito accende e spegne un led della scheda che è legato a un pin della porta e.

Il main è questo:

#include "iodefine.h"

int i;
void main(void)
{
INTC.IPRG.BIT._AD01=0x0A; /* da la priorità 10 a l’interrupt dell’ AD*/
PFC.PEIORL.WORD|=0xFFFF; /*tutta la porta e output*/
PFC.PECRL1.WORD&=0x0000; /*tutta la porta e general i/o*/
PFC.PECRL2.WORD&=0x0000; /*tutta la porta e general i/o*/
PE.DRL.WORD=0x0000; /*data register della PE*/

MST.CR2.BIT._AD1=0; /*accende l’AD, inizialmente è in stand by*/
AD1.ADCR.BIT.ADST=0; /*AD start =0*/
AD1.ADCSR.BIT.ADF=0; /*flag a 0*/
AD1.ADCSR.BIT.ADIE=1; /*abilita l’ interrupt*/
AD1.ADCSR.BIT.ADM=00; /*1 canale*/
AD1.ADCR.BIT.CKS=0; /*velocita di scansione max*/
AD1.ADCSR.BIT.CH=0x1; /* II canale*/
AD1.ADCR.BIT.ADCS=0; / *modo single scan*/


AD1.ADCR.BIT.ADST=1; /*parte l’AD*/
}
Gli altri file che trovo sono
Inthandler .h:


void INT_Manual_Reset_PC(void) __attribute__ ((interrupt_handler));
void INT_Manual_Reset_SP(void) __attribute__ ((interrupt_handler));
void INT_Illegal_code(void) __attribute__ ((interrupt_handler));
void INT_Illegal_slot(void) __attribute__ ((interrupt_handler));
void INT_CPU_Address(void) __attribute__ ((interrupt_handler));
void INT_DTC_Address(void) __attribute__ ((interrupt_handler));
void INT_NMI(void) __attribute__ ((interrupt_handler));

void INT_MTU4_TCIV4(void) __attribute__ ((interrupt_handler));
void INT_ADI0(void) __attribute__ ((interrupt_handler));
void INT_ADI1(void) __attribute__ ((interrupt_handler));
void INT_DTC_SWDTEND(void) __attribute__ ((interrupt_handler));

Penso che definisca come interrupt le varie funzioni definite. Lo lascio così;

Inthandler.c:
#include "inthandler.h"
#include "iodefine.h" /*lo ho aggiunto io per far riconoscere le strutture in ADI1*/
void INT_Manual_Reset_PC(void)
{
/*add your code here*/
}
void INT_Manual_Reset_SP(void)
{
/*add your code here*/
}
void INT_Illegal_code(void)
{
/*add your code here*/
}


void INT_ADI1(void) /*qui sono andato a scrivere il codice della funzione attivata dall’ interrupt*/
{
int i;
while (1)
{
for (i=0;i<30000;i++)
PE.DRL.WORD|=0x4000; /*queste maschere portano a 1 e 0 il pin 14 che corrisponde al led*/
for (i=30000; i<60000; i++)
PE.DRL.WORD&=0xBFFF;
i=0; }
}
…;
vects:

#include "inthandler.h"

extern void start (void); /* Startup code (in start.s) */
extern void stack (void); /* stack from linker script */

/**----------------------------------
** Typedef for the function pointer
**-----------------------------------*/

typedef void (*fp) (void);
#define VECT_SECT __attribute__ ((section (".vects")))

const fp HardwareVectors[] VECT_SECT = {
start, /* 0 Power-on reset, Program counter (PC) */
INT_Manual_Reset_PC,
INT_Manual_Reset_SP,
INT_Illegal_code,
(fp)0, /*Reserved 5*/
INT_Illegal_slot,
(fp)0, /*Reserved 7*/
(fp)0, /*Reserved 8*/

INT_ADI0,
INT_ADI1,

Dovrebbe realizzare la vector table. Non lo tocco;

iodefine.h: che associa i registri a strutture con nomi più mnemonici;

start.asm:

! Start.asm

.list
.section .text
.global _start ! global Start routine


.extern _hw_initialise ! external Sub-routine to initialise Hardware
.extern _main
.extern _data
.extern _mdata
.extern _edata
.extern _ebss
.extern _bss
.extern _stack
.extern _vects
#if DEBUG
.extern _exit
#endif

_start:
! initialise the SP for non-vectored code
mov.l stack,r15

! Call hw_initialise
mov.l hw_initialise,r1
jsr @r1
nop

!load data section from ROM to RAM only if ROMSTART is defined

#if ROMSTART
! initialise sections
mov.l edata,r1 ! edata in r1
mov.l mdata,r2 ! mdata in r2
mov.l data,r0 ! data in r0
cmp/eq r0,r1
bt start_1
nop
start_l:
mov.b @r2,r3 !get from src
mov.b r3,@r0 !place in dest
add #1,r2 !inc src
add #1,r0 !inc dest
cmp/eq r0,r1 !dest == edata?
bf start_l
nop
start_1:
#endif // ROMSTART

! zero out bss
mov.l ebss,r1
mov.l bss,r0
cmp/eq r0,r1
bt start_3
sub r2,r2
start_2:
mov.b r2,@r0
add #1,r0
cmp/eq r0,r1
bf start_2
nop
start_3:
#ifdef CPPAPP
!Initialize global constructor
mov.l _InitCtors,r1
jsr @r1
nop
#endif

mov.l main,r1
jsr @r1
nop

! call to exit
#if DEBUG
mov.l _exit_k,r1
jsr @r1
nop
#endif
#if RELEASE
exit:
bra exit
nop
#endif



.ALIGN 4
hw_initialise:
.long _hw_initialise
stack:
.long _stack
main:
.long _main
#ifdef CPPAPP
_InitCtors:
.long ___main
#endif
data:
.long _data
mdata:
.long _mdata
edata:
.long _edata
bss:
.long _bss
ebss:
.long _ebss
#if DEBUG
_exit_k:
.long _exit
#endif

.end

Che non so cosa fa(?);
hwinit:

#include "iodefine.h"

void hw_initialise (void) {
// TODO: add hardware initialisation code here
}
Qui penso che dovrei scrivere le inizializzazioni hardware che invece ho messo sul main, ma facendolo non ho avuto comunque miglioramenti.

Compilato e monitorato col debbugger mi accade che:
1) se metto il PC sull’ indirizzo del main (come ho fatto per testare gli altri programmi senza interrupt finora) il programma mi esegue tutto il main, ma finito salta all’indirizzo 00000000 e si blocca senza eseguire l’interrupt. L’AD si accende e finisce la conversione perché la sua flag visualizzando i registri vedo che la flag di fine conversione va a 1.
(dimenticavo: ho scaricato il programma sulla memoria interna del processore: FFFFD000, all’indirizzo 00000000 che è una memoria flash c’è il monitor per il debugger).

2) se vado dove si trova inizialmente il PC lo trovo all’ indirizzo corrispondente di _start.
Eseguendo passo passo o mandandolo in esecuzione mi si blocca dopo hwinit:

MOV.L R14,@-R15 void hw_initialise (void) {
MOV R15,R14
.DATA.W H'FFFF } si blocca qui col messaggio break=illegal general istruction
Sapete dove sbaglio?
sandro76 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Tascabile e con Android: BOOX Go 6 Gen II è diverso da tutti gli altri e-reader Tascabile e con Android: BOOX Go 6 Gen II &egrav...
Recensione Lenovo Idea Tab Plus: il tablet da 12 pollici che costa meno di 300 euro Recensione Lenovo Idea Tab Plus: il tablet da 12...
Oltre il contante e le crypto: tutto sull'Euro Digitale e la nuova sovranità monetaria europea Oltre il contante e le crypto: tutto sull'Euro D...
Recensione HONOR Magic V6: spessore record e super batteria. È lui il fold da battere? Recensione HONOR Magic V6: spessore record e sup...
Redmi Pad 2 9.7: ampio display, economico e peso contenuto, ma qualche limite nelle prestazioni Redmi Pad 2 9.7: ampio display, economico e peso...
Smartphone: aumenta la fedeltà al...
Mini PC, offerta a tempo: Ryzen 7 5825U ...
Addio al formato fisico? A rischio 7,2 m...
Crucial Pro DDR5 da 32GB: con la crisi d...
Garmin CIRQA, la nuova smartband senza s...
Offerta a tempo, SSD NVMe PCIe 4.0 Lexar...
Fastweb + Vodafone annuncia la disponibi...
Un minuscolo chip potrebbe rendere i LiD...
S.T.A.L.K.E.R. 2 ha recuperato i costi d...
WhatsApp migliora ancora: novità per gli...
Battlefield 6: crash continui con GeForc...
Light Flip è ufficiale, un cellul...
TIM lancia Priority, la connessione migl...
Kimi K3 sotto accusa negli USA: il model...
Piccolo è bello: Cisco presenta A...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 08:27.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v