Home Zweite Idee: Ansatz cgi_demo als cgi_qadc Was wurde modifiziert Codeanalyse
 

6.2.2 Test dieser Codeänderung

Analog zur cgi_demo sollte jetzt auch cgi_qadc compiliert werden und zusätzlich neben cgi_demo als Programm auf dem COBRA-Board plaziert werden.

(08.06.2006)

In die index.html-Datei wurde zusätzlich die Zeile auf mein eigenes cgi-Programm eingefügt. Alledings dies nur zu Testzwecken!

Im Make des Gesamtkernel muß der zusätzliche Build meines neuen cgi_qadc aktiviert werden.

Während des Makelaufs bei der Kernel-Compilierung im Arbeitsverzeichnis

schreibe ich den Output gerne in eine out.txt-Datei. Mittels dieser Umlenkung des Make-Output erhalte ich folgende Zeilen, welche zeigen, wie das cgi_generic erzeugt wird:

make[1]: Entering directory `/home/andreas/Development/COBRA_rot/uClinux/uClinux-dist-20040218-cobra-20040324/user'
for i in boa busybox cgi_generic flashw games gdbserver inetd init netflash portmap ramimage sash \
telnet telnetd tip /home/andreas/Development/COBRA_rot/uClinux \
/uClinux-dist-20040218-cobra-20040324/vendors/senTec/COBRA5282/.
/home/andreas/Development/COBRA_rot/uClinux/uClinux-dist-20040218-cobra-20040324/prop; do \
        [ ! -d $i ] || make -C $i || exit $? ; \
done
make[2]: Entering directory
 `/home/andreas/Development/COBRA_rot/uClinux/uClinux-dist-20040218-cobra-20040324/user/boa'
...
...
make[2]: Entering directory
 `/home/andreas/Development/COBRA_rot/uClinux/uClinux-dist-20040218-cobra-20040324/user/cgi_generic'
make[2]: Für das Ziel »all« ist nichts zu tun.
make[2]: Leaving directory
 `/home/andreas/Development/COBRA_rot/uClinux/uClinux-dist-20040218-cobra-20040324/user/cgi_generic'
...

Ich muß also in die Liste der Verzeichnisse innerhalb dieses Makefiles nach dem Beispiel /home/andreas/Development/COBRA_rot/uClinux/uClinux-dist-20040218-cobra-20040324/prop auch meinen eigenen Pfad /home/andreas/Development/driver/cgi_qadc einbauen.

Dort finde ich im Makefile folgende Zeilen:

dir_v = $(VEND)/$(CONFIG_VENDOR)/$(CONFIG_PRODUCT)/.
dir_p = $(ROOTDIR)/prop
...
...
dir_$(CONFIG_USER_CAN_HORCH)                += horch
dir_$(CONFIG_USER_CGI_GENERIC)              += cgi_generic
dir_$(CONFIG_USER_CGIHTML)                  += cgihtml/examples
...
...
dir_y += games

all: config
        for i in $(sort $(dir_y)) $(dir_v) $(dir_p); do \
                [ ! -d $$i ] || make -C $$i || exit $$? ; \
        done

Oder ich erweitere die Liste eben in diesem Makefile nach dem Muster:

dir_$(CONFIG_USER_CGI_GENERIC)              += cgi_generic

um den Eintrag:

dir_$(CONFIG_USER_CGI_QADC)              += cgi_qadc

Dann ist sogar meine Erweiterung konfigurierbar und verstehe, wie die Sache mit dem Konfigurieren eigentlich funktioniert.

Wie insgesamt es mit den Konfigurationsvariablen funktioniert, kann man gut an dieser Übersicht erkennen:

andreas@gericom:~/Development/COBRA_rot/uClinux
/uClinux-dist-20040218-cobra-20040324> find . -type f | xargs -n3 grep CONFIG_LINUXDIR
./user/kendin-config/Makefile:# LINUXDIR = $(CONFIG_LINUXDIR)
./.config.old:CONFIG_LINUXDIR=linux-2.4.x
./Makefile:LINUXDIR = $(CONFIG_LINUXDIR)
./.config:CONFIG_LINUXDIR=linux-2.4.x
./config/setconfig:     replace_line CONFIG_LINUXDIR= "CONFIG_LINUXDIR=$LINUXDIR" .config
./config/setconfig:     replace_line CONFIG_LINUXDIR "#define CONFIG_LINUXDIR \"$LINUXDIR\"" \
./config/autoconf.h:#define CONFIG_LINUXDIR "linux-2.4.x"
andreas@gericom:~/Development/COBRA_rot/uClinux/uClinux-dist-20040218-cobra-20040324>

Der GREP über die gesamte uClinux-Distribution zeigt, daß eine Konfigurationsvariable in der Datei .config abgelegt wird. Diese Datei wird auch gleich zu Beginn des Root-Makefile eingebunden:

############################################################################
#
# Lets work out what the user wants, and if they have configured us yet
#

ifeq (.config,$(wildcard .config))
include .config

Hier der GREP über die Konfigurationsvariable, welche als Muster dient:

andreas@gericom:~/Development/COBRA_rot/uClinux/uClinux-dist-20040218-cobra-20040324> find \
   . -type f | xargs -n3 grep CONFIG_USER_CGI_GENERIC
./user/Makefile:dir_$(CONFIG_USER_CGI_GENERIC)              += cgi_generic
./config/.config.old:CONFIG_USER_CGI_GENERIC=y
./config/.config:CONFIG_USER_CGI_GENERIC=y
./config/config.in:bool 'generic cgi'           CONFIG_USER_CGI_GENERIC
./config/config.tk:     bool $w.config.f 11 1 "generic cgi" CONFIG_USER_CGI_GENERIC
./config/config.tk:set CONFIG_USER_CGI_GENERIC 0
./config/config.tk:     global CONFIG_USER_CGI_GENERIC
./config/config.tk:     write_tristate $cfg $autocfg CONFIG_USER_CGI_GENERIC $CONFIG_USER_CGI_GENERIC [list $notmod] 2
./config/autoconf.h:#define CONFIG_USER_CGI_GENERIC 1
./config/Configure.help:CONFIG_USER_CGI_GENERIC
./vendors/ADI/Coyote/config.vendor-2.4.x:# CONFIG_USER_CGI_GENERIC is not set
./vendors/ADI/Coyote/config.vendor-2.6.x:# CONFIG_USER_CGI_GENERIC is not set
./vendors/GDB/ARMulator-EB/config.vendor:# CONFIG_USER_CGI_GENERIC is not set
...
...
./vendors/senTec/COBRA5272/config.vendor:CONFIG_USER_CGI_GENERIC=y
./vendors/senTec/COBRA5272/config.vendor-2.4.x:CONFIG_USER_CGI_GENERIC=y
./vendors/senTec/COBRA5272/config.vendor-2.6.x:CONFIG_USER_CGI_GENERIC=y
./vendors/senTec/COBRA5282/config.vendor-2.4.x:CONFIG_USER_CGI_GENERIC=y
./vendors/senTec/COBRA5282/config.vendor-2.6.x:CONFIG_USER_CGI_GENERIC=y
./vendors/KendinMicrel/KS8695/config.vendor-2.4.x:# CONFIG_USER_CGI_GENERIC is not set
./vendors/Soekris/net4801/config.vendor-2.4.x:CONFIG_USER_CGI_GENERIC=y
.

Man erkennt darin, daß vermutlich folgende Funde verdoppelt werden müssen:

./user/Makefile:dir_$(CONFIG_USER_CGI_GENERIC)              += cgi_generic
...
./config/config.in:bool 'generic cgi'           CONFIG_USER_CGI_GENERIC
./config/config.tk:     bool $w.config.f 11 1 "generic cgi" CONFIG_USER_CGI_GENERIC
./config/config.tk:set CONFIG_USER_CGI_GENERIC 0
./config/config.tk:     global CONFIG_USER_CGI_GENERIC
./config/config.tk:     write_tristate $cfg $autocfg CONFIG_USER_CGI_GENERIC $CONFIG_USER_CGI_GENERIC [list $notmod] 2
...

Der Blick in die TK-Datei zeigt, daß diese wohl doch von einem Tool generiert worden ist. Und tatsächlich! In diesem Makefile

findet sich folgender Eintrag:

...
config.tk: Makefile config.in $(SCRIPTSDIR)/header.tk $(SCRIPTSDIR)/tail.tk \
                $(wildcard $(ROOTDIR)/prop/config.in)
        $(MAKE) -C $(SCRIPTSDIR) tkparse
        ARCH=m68knommu $(SCRIPTSDIR)/tkparse < config.in > config.tmp
        @if [ -f /usr/local/bin/wish ]; then \
                echo '#!'"/usr/local/bin/wish -f" > config.tk; \
        else \
                echo '#!'"/usr/bin/wish -f" > config.tk; \
        fi
        cat $(SCRIPTSDIR)/header.tk >> ./config.tk
        cat config.tmp >> config.tk
        rm -f config.tmp
        echo "set defaults \"defconfig\"" >> config.tk
        echo "set autoconf_file \"autoconf.h\"" >> config.tk
        echo "set help_file \"Configure.help\"" >> config.tk
        cat $(SCRIPTSDIR)/tail.tk >> config.tk
        chmod 755 config.tk
...

Als Input dient hier die Datei config.in. In dieser steht gleich zu Beginn, daß hier nur Einträge addiert werden sollen. Also addiere ich:

Alt:

bool 'generic cgi'              CONFIG_USER_CGI_GENERIC
bool 'cgihtml'                  CONFIG_USER_CGIHTML

Neu:

bool 'generic cgi'              CONFIG_USER_CGI_GENERIC
bool 'qadc cgi'                 CONFIG_USER_CGI_QADC
bool 'cgihtml'                  CONFIG_USER_CGIHTML

In diesem Makefile addiere ich:

Alt:

dir_$(CONFIG_USER_CAN_HORCH)                += horch
dir_$(CONFIG_USER_CGI_GENERIC)              += cgi_generic
dir_$(CONFIG_USER_CGIHTML)                  += cgihtml/examples

Neu:

dir_$(CONFIG_USER_CAN_HORCH)                += horch
dir_$(CONFIG_USER_CGI_GENERIC)              += cgi_generic
dir_$(CONFIG_USER_CGI_QADC)                 += cgi_qadc
dir_$(CONFIG_USER_CGIHTML)                  += cgihtml/examples

Das neue Verzeichnis cgi_qadc addiere ich als Hardlink zu dem Inhalt, welchen ich eigentlich hier pflege. Da aber es sich um einen Hardlink handelt, kann nicht unterschieden werden, womit alles begann. Es liegt auch völlige Gleichberechtigung vor. Beide Ablage-Orte sind gleich sinnvoll.

Hier der entsprechende Befehl:

andreas@gericom:~/Development/COBRA_rot/uClinux
/uClinux-dist-20040218-cobra-20040324/user> ln ~/Development/driver/cgi_qadc
ln: "/home/andreas/Development/driver/cgi_qadc": harte Verknüpfung für Verzeichnisse nicht erlaubt
andreas@gericom:~/Development/COBRA_rot/uClinux
/uClinux-dist-20040218-cobra-20040324/user> ln -s ~/Development/driver/cgi_qadc
andreas@gericom:~/Development/COBRA_rot/uClinux/uClinux-dist-20040218-cobra-20040324/user>

Wie man sieht, stellte sich heraus, daß nur der Symbolic-link bei Verzeichnissen möglich ist.

Weiter muß die Datei Configure.help einen neuen Hilfe-Eintrag erhalten.

Beim Blick auf dieses File fällt mir allerdings auf, daß nicht wirklich alle Config-Variablen wirklich konfigurierbar sind.

Hier der GREP:

andreas@gericom:~/Development/COBRA_rot/uClinux
/uClinux-dist-20040218-cobra-20040324> find . -type f | xargs -n3 grep CONFIG_USER_CGI_NO
./config/Configure.help:CONFIG_USER_CGI_NO_SERIAL
./config/Configure.help:CONFIG_USER_CGI_NO_COM2
./config/Configure.help:CONFIG_USER_CGI_NO_DIALIN
./vendors/Via/EPIA/config.vendor:# CONFIG_USER_CGI_NO_SERIAL is not set
./vendors/Via/EPIA/config.vendor:# CONFIG_USER_CGI_NO_COM2 is not set
./vendors/Via/EPIA/config.vendor:# CONFIG_USER_CGI_NO_DIALIN is not set
./vendors/SecureEdge/SecureEdge1100/config.vendor:# CONFIG_USER_CGI_NO_SERIAL is not set
./vendors/SecureEdge/SecureEdge1100/config.vendor:# CONFIG_USER_CGI_NO_COM2 is not set
./vendors/SecureEdge/SecureEdge1100/config.vendor:# CONFIG_USER_CGI_NO_DIALIN is not set
./vendors/SecureEdge/SecureEdgeVPN/config.vendor-2.6.x:# CONFIG_USER_CGI_NO_SERIAL is not set
./vendors/SecureEdge/SecureEdgeVPN/config.vendor-2.6.x:# CONFIG_USER_CGI_NO_COM2 is not set
./vendors/SecureEdge/SecureEdgeVPN/config.vendor-2.6.x:# CONFIG_USER_CGI_NO_DIALIN is not set
./vendors/SnapGear/SE3400/config.vendor-2.4.x:# CONFIG_USER_CGI_NO_SERIAL is not set
./vendors/SnapGear/SE3400/config.vendor-2.4.x:# CONFIG_USER_CGI_NO_COM2 is not set
./vendors/SnapGear/SE3400/config.vendor-2.4.x:# CONFIG_USER_CGI_NO_DIALIN is not set
./vendors/SnapGear/SE4000/config.vendor-2.4.x:CONFIG_USER_CGI_NO_SERIAL=y
andreas@gericom:~/Development/COBRA_rot/uClinux/uClinux-dist-20040218-cobra-20040324>

Nach all diesen Änderungen stand unter make xconfig tatsächlich der neue Konfigurationsschalter zur Verfügung.

Auch der make selbst scheint erstmal ordentlich zu arbeiten. Der Output siehe out_cgi_qadc_01.txt sowie die Ausgaben auf stderr in out_cgi_qadc_01.txt.stderr

Bei diesem Stand ist aber nur die GUI geschaffen ohne wirkliche Kopplung zur QADC-Auslese-Routine

In der Datei template.c muß die Variable qadc_value = 46; später noch mit dem richtigen QADC-Wert beschrieben werden.


Copyright © Andreas Birkert
Letzte Aktualisierung am 20. Dezember 2013
Home Zweite Idee: Ansatz cgi_demo als cgi_qadc Was wurde modifiziert Codeanalyse