1
0
Fork 0
forked from len0rd/rockbox
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@753 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Björn Stenberg 2002-05-27 14:28:44 +00:00
parent 872e3521dd
commit 6365d0e6cc
24 changed files with 233 additions and 0 deletions

BIN
www/devcon/IMG_4083.JPG Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 722 KiB

BIN
www/devcon/IMG_4084.JPG Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 727 KiB

BIN
www/devcon/IMG_4085.JPG Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 788 KiB

BIN
www/devcon/IMG_4086.JPG Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 612 KiB

BIN
www/devcon/IMG_4087.JPG Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 883 KiB

BIN
www/devcon/IMG_4088.JPG Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 989 KiB

BIN
www/devcon/IMG_4089.JPG Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 983 KiB

5
www/devcon/bildtext.txt Normal file
View file

@ -0,0 +1,5 @@
4083: Comparison between Recorder and Player
4084: Contest: Spot the development box!
4086: A stack of "virgins"!
4087: A pre-4.50 player (left) and a post-4.50 player (right).
4089: There's lots of fun to be had with these things!

BIN
www/devcon/img4083.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

BIN
www/devcon/img4083t.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
www/devcon/img4084.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

BIN
www/devcon/img4084t.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

BIN
www/devcon/img4085.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

BIN
www/devcon/img4085t.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.8 KiB

BIN
www/devcon/img4086.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

BIN
www/devcon/img4086t.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
www/devcon/img4087.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

BIN
www/devcon/img4087t.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

BIN
www/devcon/img4088.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

BIN
www/devcon/img4088t.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

BIN
www/devcon/img4089.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

BIN
www/devcon/img4089t.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

132
www/devcon/index.t Normal file
View file

@ -0,0 +1,132 @@
#define _PAGE_ Rockbox Developer Conference 2002
#include "head.t"
<table align="right"><tr><td><a href="show.cgi?img4083.jpg"><img src="img4083t.jpg" alt="photo" border=0 width=200 height=150></a><br><small><i>Comparison of Recorder and Player</i></small></td></tr></table>
<p>Well, almost. :-) Björn, Linus, Daniel and Kjell sat down at Linus' house
friday night (2002-04-19) with our Archoses and had a long and fruitful discussion about software design.
Here are a few things that we discussed:
<h2>Application Programming Interfaces</h2>
<p>We want to try to stick to POSIX where these exist and are practical. The
reason is simply that many people already know these APIs well. Here are a
few which haven't already been defined in the code:
<h3>File operations</h3>
<ul>
<li>open
<li>close
<li>read
<li>write
<li>seek
<li>unlink
<li>rename
</ul>
<table align="right"><tr><td><a href="show.cgi?img4084.jpg"><img src="img4084t.jpg" alt="photo" border=0 width=200 height=150></a>
<br><small><i>Contest: Spot the development box!</i></small></td></tr></table>
<h3>Directory operations</h3>
<ul>
<li>opendir
<li>closedir
<li>readdir
</ul>
<h3>Disk operations</h3>
<ul>
<li>readblock
<li>writeblock
<li>spindown
<li>diskinfo
<li>partitioninfo
</ul>
<p>We also decided that we will use the 'newlib' standard C library,
replacing some functions with smaller variants as we move forward.
<h2>Multitasking</h2>
<p>We spent much time discussing and debating task scheduling, or the lack
thereof. First, we went with the idea that we don't really need "real"
scheduling. Instead, a simple "tree-task" system would be used: A
main-loop, a timer tick and a "bottom half" low-priority interrupt, each
with an event queue.
<p>Pretty soon we realized that we will want to:
<ol style="a">
<li> Use a timer tick to poll disk I/O (assuming we can't get an interrupt)
<li> Perform slow disk operations in both the MP3->DAC feeder and the user
interface, sometimes at the same time.
<li> Not lock up the user interface during I/O.
</ol>
<table align="right"><tr><td><a href="show.cgi?img4086.jpg"><img src="img4086t.jpg" alt="photo" border=0 width=200 height=150></a>
<br><small><i>A stack of "virgins"!</i></small></td></tr></table>
<p>At the same time, we agreed that we should not walk into the common trap
of engaging in "job splitting". That is, to split up jobs in small chunks
so they don't take so long to finish. The problem with job splitting is
that it makes the code flow very complex.
<p>After much scratching our collective heads over how to make a primitive
"three-task" system be able to do everything we wanted without resorting
to complex job splitting, we finally came to the conclusion that we were
heading down the wrong road:
<p><blockquote>
<b>We need threading.</b>
</blockquote>
<p>Even though a scheduler adds complexity, it makes the rest of the code so
much more straight-forward that the total net result is less overall
complexity.
<p>To keep it simple, we decided to use a cooperative scheduler. That is, one
in which the threads themselves decide when scheduling is performed. The
big gain from this, apart from making the scheduler itself less complex,
is that we don't have to worry as much about making all code "multithread
safe".
<p>Affording ourselves the luxury of threads, we soon identified four basic
threads:
<ul>
<li>Disk thread, performing all disk operations
<li>UI thread, handling the user interface
<li>MP3 feed thread, making sure the MAS is fed with data at all times
<li>I2C thread, handling the sometimes very relaxed timing of the I2C bus
</ul>
<p>Threads use message passing between them and each have a message queue
associated to it.
<table align="right"><tr><td><a href="show.cgi?img4089.jpg"><img src="img4089t.jpg" alt="photo" border=0 width=200 height=150></a>
<br><small><i>There's much fun to be had with these things!</i></small></td></tr></table>
<p>In addition to the threads, we need a timer interrupt with the ability to
send messages to threads at specific intervals. This will also be used to
scan the keys of the jukebox and handle key repeat detection (when a key
has been pressed for a number of ticks).
<p>None of these things are, of course, written in stone. Feel free to
comment, discuss and argue about them!
<p>We are currently 89 subscribers to this list. If you want to get more
deeply involved in what's going on, I encourage you to:
<ul>
<li>Subscribe to the rockbox-cvs list, to see all code that goes in.
<li>Join the #rockbox channel on irc.openprojects.net. There are always a
couple of us in there.
</ul>
<p>I have written a set of guidelines for contributing code to the project.
Take a look at them in CVS or here:
<a href="http://bjorn.haxx.se/rockbox/firmware/CONTRIBUTING">CONTRIBUTING</a>
<p>/Björn
#include "foot.t"

96
www/devcon/show.cgi Executable file
View file

@ -0,0 +1,96 @@
#!/usr/bin/perl
use File::Basename;
$cgi = basename $0;
print "Content-Type: text/html\n\n";
$image = $ARGV[0];
$image =~ /img(\d+)/;
print "<html><head><title>Rockbox - Photo $1</title></head>\n";
print "<body bgcolor=black text=white link=white vlink=gray>\n";
if ($image eq "" ) {
print "<p>No image specified\n";
exit;
}
print "<h1>&nbsp;</h1><div align=center><img src=$image>\n";
# compressed image
if ( $image =~ /img(\d+).jpg/ ) {
$num = $1;
for $i ( 1 .. 10 ) {
$prev = sprintf("%04d",$num-$i);
last if ( -f "img$prev.jpg" );
}
if ( $prev == $num-10 ) {
undef $prev;
}
for $i ( 1 .. 20 ) {
$next = sprintf("%04d",$num+$i);
print "<!-- Trying $next -->\n";
last if ( -f "img$next.jpg" );
}
if ( $next == $num+20 ) {
undef $next;
}
if ( -f "bildtext.txt" ) {
open FILE, "<bildtext.txt";
@txt = <FILE>;
close FILE;
@match = grep /^$num: /, @txt;
if ( $match[0] =~ /^$num: (.*)/ ) {
print "<p><i>$1</i>\n";
}
}
print "<p>\n";
print "<a href=$cgi?img$prev.jpg>&lt; Previous</a> &nbsp; \n" if ( $prev );
print "<a href=.>Index</a>\n";
if ( -f "IMG_$num.JPG" ) {
$size = int( (stat("IMG_$num.JPG"))[7] / 1024 );
print " &nbsp; <a href=IMG_$num.JPG>Fullsize ($size kB)</a>\n";
}
print " &nbsp; <a href=$cgi?img$next.jpg>Next &gt;</a>\n" if ( $next );
}
# showing fullsize already
elsif ( $image =~ /IMG_(\d+).JPG/ ) {
$num = $1;
for $i ( 1 .. 10 ) {
$prev = sprintf("%04d",$num-$i);
last if ( -f "IMG_$prev.JPG" );
}
if ( $prev == $num-10 ) {
undef $prev;
}
for $i ( 1 .. 20 ) {
$next = sprintf("%04d",$num+$i);
print "<!-- Trying $next -->\n";
last if ( -f "IMG_$next.JPG" );
}
if ( $next == $num+20 ) {
undef $next;
}
print "<p>\n";
print "<a href=$cgi?IMG_$prev.JPG>&lt; Previous</a> &nbsp; \n" if ( $prev );
print "<a href=.>Index</a>\n";
if ( -f "img$num.jpg" ) {
$size = int( (stat("img$num.jpg"))[7] / 1024 );
print " &nbsp; <a href=img$num.jpg>Small ($size kB)</a>\n";
}
print " &nbsp; <a href=$cgi?IMG_$next.JPG>Next &gt;</a>\n" if ( $next );
}
print "</div></body></html>\n";