[OT ITA] Lo spamm bar (Part 2)

... e di che? :grin:

... t'assicuro che quello è nulla ... a Via Veneto le macchine, la mattina, le trovavi sotto uno/due cm. di guano ... non scherzavo sul fatto che una volta per portarla a lavare ... è stato un dramma !!! :sob:

Guglielmo

... Americani ... :crazy_face:

... normale ... altrimenti mangiano il cartone e ti fanno pure causa perché non gli hai detto che dovevano tirare fuori la pizza ... :crazy_face: :crazy_face: :crazy_face:

Guglielmo

"ma sei sicuro che non ci vedranno ?" ... "tranquillo, la mimetizzazione e' perfetta" ...
:rofl:

1 Like

Mi ricorda il problema che hai avuto con la Teensy4.1

Oh, comunque, il tanto bistrattato risuonatore ceramico della UNO, su una UNO cinese da 5€ ... mediamente sbaglia meno di UN secondo su 24 ore (provato confrontando il tempo con quello fornito da un server NTP) ...

In passato avevo provato con un ATtiny85 ed il suo oscillatore interno e ... nonostrante tanti aggiustamenti via software, avevo comunque degli errori di decine di secondi sulle 24 ore ... devo dire che sono rimasto sorpreso dei risultati della UNO (... anche se, chiaramente, la precisione non è paragonabile con quella di schede che hanno il clock quarzato) :slight_smile:

Guglielmo

Confrontare una Uno originale in modo analogo?

... che strani "pesci" ... :rofl:

Non credo cambi molto ... appena ho tempo provo :wink:

Guglielmo

Come hai eseguito il test, facendo un "orologio" con millis()?

Ho salvato il primo valore ritornato da NTP e simultaneamente quello di millis() come punto di partenze e poi ho continuato, ogni 10 secondi, a verificare di quanto era cambiato sia il valore di NTP che di millis(). Molto banale.

Guglielmo

Una domanda

La faccio qui anche se è legata ad arduino, ma non ad un problema specifico,solo una cosa che non mi è chiara

Se io realizzassi un clone di arduino con una MCU priva di bootloader, avrei uno spazio maggiore per scrivere il programma principale?

Lo do che sembra una domanda da neofita, ma le mie conoscenze sono in effetti un po' a macchia di leopardo...

Certo, ma piuttosto poco ... Optiboot, che è il bootloader ormai usato da un po' di tempo su Arduino UNO, occupa circa ½ KByte ... non un gran che ... :roll_eyes:

Guglielmo

Ah ... non ti serve realizzare "un clone di Arduino", la prima volta che lo programmi con un programmatore ISP, cancelli il bootloader, quindi ... va benissimo anche un Arduino UNO normalissimo.

Guglielmo

Si., scusa,

Ho le idee un po' confuse

Ma questo significa che il codice compilato e linkato è rilocabile?
Perché con o senza bootloader cambieranno gli indirizzi di memoria...

Questo ha generato poi la mia precedente domanda

... un pochino piu complicato non c'era ? ... :stuck_out_tongue_closed_eyes:

Se ben ricordo :roll_eyes: vengono usati sempre JMP relativi, mai assoluti, quindi SI, diventa posizionabile dove vuoi.

Guglielmo

EDIT: il codice dovrebbe (uso il condizionale perché non ricordo bene su AVR, sicuramente è diverso per ARM) essere compilato a partire dalla locazione ZERO quindi tutti i vari vettori di interrupt, ecc. fanno riferimento a questa ... nel caso di bootloader, credo sia suo compito aggiustare tali vettori dopo il caricamento tenendo conto di dove a messo il codice.

Su altre MCU ed altri ambienti, se hai un bootloader, devi modificare i dati del file che gestisce il linker per dirgli dove verrà caricato l'eseguibile ...

Ad esempio, per MPLAB X e PIC32 (caso reale per una specifica board di sviluppo che ha un bootloader) c'è un file .ld in cui puoi specificare il tutto (... ne riporto una parte per chiarire troncando tutti i vari vettori di nterrupt):

/* Default linker script, for normal executables */
OUTPUT_FORMAT("elf32-tradlittlemips")
OUTPUT_ARCH(pic32mx)
ENTRY(_reset)
/*
 * Provide for a minimum stack and heap size
 * - _min_stack_size - represents the minimum space that must be made
 *                     available for the stack.  Can be overridden from
 *                     the command line using the linker's --defsym option.
 * - _min_heap_size  - represents the minimum space that must be made
 *                     available for the heap.  Can be overridden from
 *                     the command line using the linker's --defsym option.
 */
EXTERN (_min_stack_size _min_heap_size)
PROVIDE(_min_stack_size = 0x400) ;
/* PROVIDE(_min_heap_size = 0) ; Defined on the command line */
/*************************************************************************
 * Processor-specific object file.  Contains SFR definitions.
 *************************************************************************/
INPUT("processor.o")

/*************************************************************************
 * Processor-specific peripheral libraries are optional
 *************************************************************************/
OPTIONAL("libmchp_peripheral.a")
OPTIONAL("libmchp_peripheral_32MX795F512L.a")

/*************************************************************************
 * For interrupt vector handling
 *************************************************************************/
PROVIDE(_vector_spacing = 0x00000001);
_ebase_address =  0x9D00A000;

/*************************************************************************
 * Memory Address Equates
 * _RESET_ADDR      -- Reset Vector
 * _BEV_EXCPT_ADDR  -- Boot exception Vector
 * _DBG_EXCPT_ADDR  -- In-circuit Debugging Exception Vector
 * _DBG_CODE_ADDR   -- In-circuit Debug Executive address
 * _DBG_CODE_SIZE   -- In-circuit Debug Executive size
 * _GEN_EXCPT_ADDR  -- General Exception Vector
 *************************************************************************/
_RESET_ADDR              = (0x9D00A000 + 0x1000);
_BEV_EXCPT_ADDR          = ((0x9D00A000 + 0x1000) + 0x380);
_DBG_EXCPT_ADDR          = ((0x9D00A000 + 0x1000) + 0x480);
_DBG_CODE_ADDR           = 0xBFC02000;
_DBG_CODE_SIZE           = 0xFF0     ;
_GEN_EXCPT_ADDR          = _ebase_address + 0x180;

/*************************************************************************
 * Memory Regions
 *
 * Memory regions without attributes cannot be used for orphaned sections.
 * Only sections specifically assigned to these regions can be allocated
 * into these regions.
 *************************************************************************/
MEMORY
{
  kseg0_program_mem    (rx)  : ORIGIN = (0x9D00A000 + 0x1000 + 0x490), LENGTH = 0x81000 - (0xA000 + 0x1000 + 0x490) /* All C Files will be located here */ 
  kseg0_boot_mem             : ORIGIN = 0x9D00A000, LENGTH = 0x0 /* This memory region is dummy */ 
  exception_mem              : ORIGIN = 0x9D00A000, LENGTH = 0x1000 /* Interrupt vector table */
  kseg1_boot_mem             : ORIGIN = (0x9D00A000 + 0x1000), LENGTH = 0x490 /* C Startup code */
  debug_exec_mem             : ORIGIN = 0xBFC02000, LENGTH = 0xFF0
  config3                    : ORIGIN = 0xBFC02FF0, LENGTH = 0x4
  config2                    : ORIGIN = 0xBFC02FF4, LENGTH = 0x4
  config1                    : ORIGIN = 0xBFC02FF8, LENGTH = 0x4
  config0                    : ORIGIN = 0xBFC02FFC, LENGTH = 0x4
  kseg1_data_mem       (w!x) : ORIGIN = 0xA0000000, LENGTH = 0x20000
  sfrs                       : ORIGIN = 0xBF800000, LENGTH = 0x100000
  configsfrs                 : ORIGIN = 0xBFC02FF0, LENGTH = 0x10
}

/*************************************************************************
 * Configuration-word sections
 *************************************************************************/
SECTIONS
{
  .config_BFC02FF0 : {
    KEEP(*(.config_BFC02FF0))
  } > config3
  .config_BFC02FF4 : {
    KEEP(*(.config_BFC02FF4))
  } > config2
  .config_BFC02FF8 : {
    KEEP(*(.config_BFC02FF8))
  } > config1
  .config_BFC02FFC : {
    KEEP(*(.config_BFC02FFC))
  } > config0
}
PROVIDE(_DBG_CODE_ADDR = 0xBFC02000) ;
PROVIDE(_DBG_CODE_SIZE = 0xFF0) ;
SECTIONS
{
  /* Boot Sections */
  .reset _RESET_ADDR :
  {
    KEEP(*(.reset))
    KEEP(*(.reset.startup))
  } > kseg1_boot_mem
  .bev_excpt _BEV_EXCPT_ADDR :
  {
    KEEP(*(.bev_handler))
  } > kseg1_boot_mem
  .dbg_excpt _DBG_EXCPT_ADDR (NOLOAD) :
  {
    . += (DEFINED (_DEBUGGER) ? 0x8 : 0x0);
  } > kseg1_boot_mem
  .dbg_code _DBG_CODE_ADDR (NOLOAD) :
  {
    . += (DEFINED (_DEBUGGER) ? _DBG_CODE_SIZE : 0x0);
  } > debug_exec_mem
  .app_excpt _GEN_EXCPT_ADDR :
  {
    KEEP(*(.gen_handler))
  } > exception_mem
  .vector_0 _ebase_address + 0x200 :
  {
    KEEP(*(.vector_0))
  } > exception_mem
  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_0) <= (_vector_spacing << 5), "function at exception vector 0 too large")
  .vector_1 _ebase_address + 0x200 + (_vector_spacing << 5) * 1 :
  {
    KEEP(*(.vector_1))
  } > exception_mem
  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_1) <= (_vector_spacing << 5), "function at exception vector 1 too large")
  .vector_2 _ebase_address + 0x200 + (_vector_spacing << 5) * 2 :
  {
    KEEP(*(.vector_2))
  } > exception_mem
  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_2) <= (_vector_spacing << 5), "function at exception vector 2 too large")
  .vector_3 _ebase_address + 0x200 + (_vector_spacing << 5) * 3 :
  {
    KEEP(*(.vector_3))
  } > exception_mem
  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_3) <= (_vector_spacing << 5), "function at exception vector 3 too large")
  .vector_4 _ebase_address + 0x200 + (_vector_spacing << 5) * 4 :
  {
    KEEP(*(.vector_4))
  } > exception_mem
  ASSERT (_vector_spacing == 0 || SIZEOF(.vector_4) <= (_vector_spacing << 5), "function at exception vector 4 too large")

Guglielmo

@Standardoil : ho modificato leggermente il mio post #1168 ed aggiunto il post #1169 sempre relativo all'argomento.

Guglielmo

Grazie