[En-Nut-Discussion] Nut OS reliable on AT91SAM7X Evaluation Board?

Ulrich Prinz uprinz2 at netscape.net
Tue Nov 17 19:33:07 CET 2009


Hi!

Marcus Jansson schrieb:
> Ulrich Prinz wrote:
>> I'd like to implement PDC/DMA for the network and the SPI channels. 
> This can be done, the SPI seem to have a long list of errata associated with the PDC, though.
> 
Yes, I saw it and I don't like it :) But what should I do, I'd like to 
get out optimal performance and why carrying bytes by hand if these is 
an automated way for the background.

>> If supported, I'd like to implement it for a background memcpy too.
> I can not see how this can be done with the PDC, unless you're talking about a memcpy() to/from memories (possibly
> eeproms) connected to the SPI or similar. Otherwise a hand optimized LDM/STM block copy loop instead of the existing
> slow memcpy() might be in order for increasing memcpy() performance in internal RAM?
> 
Yeah, there might be an optimization chance in the code for the CPU 
driven memcpy. But most systems do many different tasks. So why block 
the CPU with some dump copy while other things that need calculation 
work have to wait. And it doesn't make programming much more complex.
It's another strategy behind the programming style, more DSP way. SO 
something ist giving you an interrupt and you setup DMA to fetch the 
data into a buffer_1. After DMA finishes, you setup a function to modify 
the content at special places, lets say filling in certain data into 
certain positions. Then you setup DMA to copy the buffer over to another 
functions buffer to fill in other data or preparation of frame 
information. This can be repeated many times until the chain reaches a 
point where everything is prepared and the data can be send to another 
device like TCP or IIS or whatever. This can also be done via DMA.

Now, while this DMA chaining doesn't make sense if you only have one 
buffer and slow incoming data, it important for situations where you 
have several of each buffer in parallel. While receiving in buffer 1, 
copy out of buffer 0. While decoding in the first functions buffer 0, 
transfer decoded data to buffer 1 of second function.

The style of programming is then totally different as it is in Nut/OS 
now, as you program functions as interrupt requests. The software is 
controlled by the data moving through it and not the other, normal, way 
round.

It's sort of DSP programming where you attach handlers to the buffers, 
the so called pipes.

In my case I have to route radio packets the often only need another 
header in front of existing data. Instead of creating another buffer of 
the size of the packet plus the packet itself, filling in the new header 
and attaching the packet with memcpy, I simply create a new buffer, add 
the header in front and DMA-copy the packet into the tail. With the DMA 
Interrupt I setup another DMA throwing the new packet through SPI to tha 
radio chipset.

There is another way of handling this. I setup a table of pointers 
collecting a radio packet and it's different headers out of the memory. 
But then I have to carefully track each pointer operation and have to 
check if another header exists and so on. It will save some time but I 
have to track a lot. The previous DMA wakes DMA is much more elegant and 
the CPU can do lots of other things while the DMA works in background.

There is another reason for DMA. The SPI to the radio chipset can run at 
12MBit plus. You cannot put data fast enough together if you try to do 
that in polling mode... I guess that even on 4MBit I have larger gaps 
between the packets where the CPU is busy with fetching bytes.

> What was the reason for not having Thumb code in Nut/OS?

I never thought about that and I wasn't in the project at the time where 
these decision was made. So you have to ask Harald for that.

Best regards, Ulrich


More information about the En-Nut-Discussion mailing list