[Tinyos-devel] TinyOS on Cortex M3?

John Regehr regehr at cs.utah.edu
Thu Mar 13 14:11:36 PDT 2008


Thanks for all the details Paul.  This looks like a very entertaining 
architecture.

So I guess the answer to my query (about whether this is being worked on) 
is "not yet but it looks promising."

John Regehr


On Thu, 13 Mar 2008, Paul Kimelman wrote:

> To do justice to a port, it should be done taking advantage of the many 
> specialized capabilities of Cortex-M3. It is important to note that CM3 is 
> very much an interrupt-driven processor. The interrupt controller is 
> integrated in, and provides 8 levels (minimum) priorities for all ISRs, 
> including all processor faults (bus fault (both I and D), invalid 
> instruction, divide-by-0, etc). It takes a max 12 cycles from pre-emption to 
> 1st instruction of actual code (the HW pushes the scratch registers for you, 
> so this is entry to a normal C function) and is designed to have a max of 2 
> cycles latency, even for load/store multiple (but some chips like the STM32 
> have multiple cycle stalls on memory/peripheals, so the worst case single 
> stall must be considered).
> It has multiple features to avoid use of interrupt-disable (critical 
> sections).
> More importantly, it provides integrated sleep and integrated tasking models. 
> The integrated sleep allows for both SLEEP and DEEPSLEEP as builtin concepts 
> to the processor (DEEPSLEEP is presumed to take more cycles to awaken in 
> exchange for using less power, but it is up to the system design to determine 
> what it does). SLEEP/DEEPSLEEP can be activated from use of an instruction 
> (WFI normally) or by return from last exception (if selected). Return from 
> last exception means that if no task is ready to run, you can skip idling 
> code and the HW will just sleep (with faster wakeup on next interrupt). There 
> is a built-in timer (SYSTICK) which ensures the OS port works the same on all 
> CM3 chips. The tasking model is normally supported by PendSV. PendSV is a bit 
> in the interrupt controller. It allows an ISR to set that bit so that upon 
> return from all active interrupts, the task scheduler will be woken. By 
> making the task scheduler (PendSV) the lowest priority interrupt, it then 
> runs only when there is something to do. Note that PendSV is reentrant safe 
> and also atomicity safe. So, if about to return from PendSV (nothing to do) 
> and an interrupt comes in and the ISR sets PendSV again, PendSV ISR will exit 
> and re-enter immediately (even faster than 12 cycles, basically jumps back to 
> itself).
> Critical sections can be avoided in three ways: BASEPRI, exclusives, 
> bit-band. BASEPRI allows masking all interrupts of a specified priority and 
> below (0 is highest, so BASEPRI=5 masks 5, 6, and 7). For example, if the top 
> 4 priority interrupts (0-3) do not use memory objects, then the critical 
> section on memory object manipulation would mask off only the next 4 
> priorities by writing a 4. To make BASEPRI even easier, a register called 
> BASEPRI_MAX is written to - this only raises the priority mask and does not 
> lower. So, you do not have to use "if (critsect_pri < BASEPRI) BASEPRI = 
> critsect_pri;". Instead, you just set BASEPRI_MAX and it will only set if a 
> lower number (you restore by writing the saved value to BASEPRI). 
> Additionally, you can avoid use of critical sections using Exclusives. This 
> is LDREX and STREX. This makes it possible to read a value from memory (byte, 
> half, word, or bit), modify it, and then write it back; if another task or an 
> ISR has written it between the load and store, the store will not happen and 
> you will be told that via a register. So, you use a spin-lock model with no 
> extra test-and-set location. Exclusives can be used for FIFOs (e.g. from ISR 
> to tasks or tasks to ISRs) as non-locking and non-blocking models, as well as 
> for many other shared resources. Finally the bit-band can be used. Bit-band 
> maps 1MB of SRAM and 1MB of peripheral into 32MB of addressable bits (each). 
> So, for each word in the SRAM, you have 32 words in the bit-band space; these 
> each access 1 bit of the word (you can also access by byte or half, but since 
> a 32-bit register model, access by word is convenient). The bit band not only 
> allows for memory savings (when you use boolean data), but can be used for 
> critical data as well. Writes to the bit-band area are atomic in HW (implicit 
> RMW of word cannot be split by an ISR). So, bits can be used for population 
> and claim bits as well as requests. For example, ISRs can not only set 
> PendSV, but also set tasks-to-wake via bit band. Then, the PendSV handler can 
> read by word (or DWORD) to see if any tasks are waiting to be woken (or have 
> work to do). To find the 1st task to run, you can use the CLZ instruction; 
> this is count-leading-zeros. So, it will return the MSb which is 1. If you 
> need the LSb, you use RBIT and then CLZ.
>
> Hope this helps.
>
> Regards, Paul
>
>
> John Regehr wrote:
>> I'm just curious-- has anyone looked into porting TinyOS to Cortex M3 
>> chips?  These represent ARM's attempt to woo developers away from 8 and 16 
>> bit MCUs.  Based on a quick look, the STM32 product line from ST has power 
>> numbers roughly in the ballpark for a mote-class device.
>>
>>   http://www.st.com/mcu/inchtml.php?fdir=pages&fnam=stm32
>>   http://www.st.com/mcu/files/mcu/1190813173.pdf
>> 
>> John Regehr
>> _______________________________________________
>> Tinyos-devel mailing list
>> Tinyos-devel at millennium.berkeley.edu
>> https://www.millennium.berkeley.edu/cgi-bin/mailman/listinfo/tinyos-devel
>> 
>
> -- 
> Paul Kimelman                   Personal email
> Home: 925.256.4048              Mobile: 510.882.6495
>


More information about the Tinyos-devel mailing list