[Tinyos Core WG] Boot Order
Philip Levis
pal at cs.stanford.edu
Fri May 23 19:26:58 PDT 2008
On May 23, 2008, at 10:53 AM, David Moss wrote:
> An Init interface will complete when the Task queue is empty.
> Waiting for an
> interrupt breaks that model, which is the reason why interrupts are
> disabled
> during Init.
No -- you can wait for an interrupt with a self-posting task. Or,
just spin on the interrupt pending flag (no need to enable).
>
> That, in the past, has lead to platform-specific driver
> initialization code
> like this (MotePlatformC.nc):
>
> void TOSH_FLASH_M25P_DP() {
> // SIMO0, UCLK0
> TOSH_MAKE_SIMO0_OUTPUT();
> TOSH_MAKE_UCLK0_OUTPUT();
> TOSH_MAKE_FLASH_HOLD_OUTPUT();
> TOSH_MAKE_FLASH_CS_OUTPUT();
> TOSH_SET_FLASH_HOLD_PIN();
> TOSH_SET_FLASH_CS_PIN();
>
> TOSH_wait();
>
> // initiate sequence;
> TOSH_CLR_FLASH_CS_PIN();
> TOSH_CLR_UCLK0_PIN();
>
> TOSH_FLASH_M25P_DP_bit(TRUE); // 0
> TOSH_FLASH_M25P_DP_bit(FALSE); // 1
> TOSH_FLASH_M25P_DP_bit(TRUE); // 2
> TOSH_FLASH_M25P_DP_bit(TRUE); // 3
> TOSH_FLASH_M25P_DP_bit(TRUE); // 4
> TOSH_FLASH_M25P_DP_bit(FALSE); // 5
> TOSH_FLASH_M25P_DP_bit(FALSE); // 6
> TOSH_FLASH_M25P_DP_bit(TRUE); // 7
>
> TOSH_SET_FLASH_CS_PIN();
>
> TOSH_SET_SIMO0_PIN();
> TOSH_MAKE_SIMO0_INPUT();
> TOSH_MAKE_UCLK0_INPUT();
> TOSH_CLR_FLASH_HOLD_PIN();
> }
>
Not really; this code is for the most part just hacked (still
bleeding) from 1.x; no-one bothered to make it cleam.
> This is bad. Architecturally, the flash driver itself should be
> responsible
> for putting the flash chip into deep sleep using the SPI bus... not
> some
> platform-specific code in a platform directory.
Agreed. But I don't think this is because of the architecture, rather
just a 1.x holdover.
>
> TEP 107 does allow you to enable interrupts during Init, as long as
> you turn
> them back off and don't let any other component capture an
> interrupt (other
> components should enable their own interrupts when they're ready to
> handle
> them anyway). Would you say that the code above could be rewritten
> into the
> flash driver in SoftwareInit by enabling interrupts, accessing the
> SPI bus,
> and spinning a task until the SPI bus commands are complete? Doing
> so would
> still require platform-dependent code to enable/disable the correct
> SPI
> interrupts if you don't want to turn all of them on.
Actually, what I'd do is use SpiByte to send the commands. Since it
blocks, interrupts being disabled is not a problem.
Phil
More information about the Tinyos-2.0wg
mailing list