From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 15978 invoked by alias); 27 Jul 2007 07:27:09 -0000 Received: (qmail 15967 invoked by uid 22791); 27 Jul 2007 07:27:07 -0000 X-Spam-Check-By: sourceware.org Received: from defer-pm01.ocn.ad.jp (HELO defer-pm01.ocn.ad.jp) (211.129.14.55) by sourceware.org (qpsmtpd/0.31) with ESMTP; Fri, 27 Jul 2007 07:27:03 +0000 Received: from pop132.ocn.ne.jp (pop132.ocn.ne.jp [60.37.31.215]) by defer-pm01.ocn.ad.jp (Postfix) with ESMTP id BF03132DA; Fri, 27 Jul 2007 16:26:57 +0900 (JST) Received: from ariga (p7072-ipbf408marunouchi.tokyo.ocn.ne.jp [124.87.211.72]) by pop132.ocn.ne.jp (OCN) with SMTP id l6R7QvrS019821; Fri, 27 Jul 2007 16:26:57 +0900 (JST) Message-ID: <000d01c7d01f$83219c10$1c0110ac@ariga> From: "ariga masahiro" To: "Sergei Gavrikov" Cc: References: <002501c7caa1$631c1a40$1c0110ac@ariga> <000b01c7cce1$751496e0$1c0110ac@ariga> <20070723200401.GA9620@ubuntu> Date: Fri, 27 Jul 2007 07:27:00 -0000 MIME-Version: 1.0 Content-Type: text/plain; format=flowed; charset="ISO-8859-1"; reply-type=original Content-Transfer-Encoding: 7bit X-Mailer: Microsoft Outlook Express 6.00.2900.2869 X-IsSubscribed: yes Mailing-List: contact ecos-discuss-help@ecos.sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: ecos-discuss-owner@ecos.sourceware.org Subject: Re: [ECOS] Difference between "go" on Script and manual enter? X-SW-Source: 2007-07/txt/msg00203.txt.bz2 Hi , Concerning my question about Script "go" not going well, (I re_post my first question below), I traced applications in both cases (that is,manually "go" and Script "go"). And I discovered some factors(although I can't pinpont darn cause) of different behaviors. I relate my finding in hope that you could pinpoint cause, (I apologize,too difficult to fathom source.) and appreciate you to resolve this pain in my neck. I use abbreviations MAN for manually "go", SCR for Script "go". Both cases,first try to diag_printf "Network stack using". in diag.cxx at function _vprintf(void (*putc)(char c, void **param), void **param, const char *fmt, va_list ap) (*putc)(c, param); //here,MAN:print 'N' to host PC, SCR:nothing though c contains 'N' from here I traced, both traced to, _diag_write_char(char c, void **param) { diag_write_char(c); } and, externC void diag_write_char(char c) { /* Translate LF into CRLF */ if( c == '\n' ) { HAL_DIAG_WRITE_CHAR('\r'); } HAL_DIAG_WRITE_CHAR(c); } and both execute HAL_DIAG_WRITE_CHAR(c); after jump to hal_if.h __data_VV(CYGNUM_CALL_IF_CONSOLE_PROCS, __call_if_console_procs_t) hal_if.c void hal_if_diag_write_char(char c) { hal_virtual_comm_table_t* __chan = CYGACC_CALL_IF_CONSOLE_PROCS(); if (__chan) CYGACC_COMM_IF_PUTC(*__chan, c); else { __chan = CYGACC_CALL_IF_DEBUG_PROCS(); // FIXME: What should be done if assertions are not enabled? // This is a bad bad situation - we have no means for diag // output; we want to hit a breakpoint to alert the developer // or something like that. CYG_ASSERT(__chan, "No valid channel set"); CYGACC_COMM_IF_PUTC(*__chan, c); } // Check interrupt flag if (CYGACC_CALL_IF_CONSOLE_INTERRUPT_FLAG()) { CYGACC_CALL_IF_CONSOLE_INTERRUPT_FLAG_SET(0); cyg_hal_user_break(0); } } from here behaves differentry, both cases execute CYGACC_COMM_IF_PUTC(*__chan, c); MAN: traced to hal_if.c __call_voidCOMM1(IF_PUTC, void, __comm_if_putc_t, cyg_uint8) and /* Lock the scheduler. */ externC void cyg_scheduler_lock(void) { Cyg_Scheduler::lock(); and static void inc_sched_lock() { sched_lock++; }; then,SH serial routine, /sh/sh3/v2_0/src/sh3_scif.c cyg_hal_plf_scif_putc(void* __ch_data, cyg_uint8 c) and properly print string to host PC HYPERTERMINAL. Whereras, SCR: traced to hal_if.h __call_voidCOMM1(IF_PUTC, void, __comm_if_putc_t, cyg_uint8) and externC void cyg_scheduler_lock(void) { Cyg_Scheduler::lock(); // get_sched_lock() is unsigned, see below "cyg_ucount32 lock" CYG_ASSERT( (0xff000000 & (Cyg_Scheduler::get_sched_lock())) == 0, "Scheduler overlocked" ); } and static void inc_sched_lock() { sched_lock++; }; and nop_service(void) { // This is the default service. It always returns false (0), and // _does not_ trigger any assertions. Clients must either cope // with the service failure or assert. return 0; } and externC void cyg_scheduler_unlock(void) { cyg_ucount32 slock = Cyg_Scheduler::get_sched_lock(); after repeat,and never jump to cyg_hal_plf_scif_putc(void* __ch_data, cyg_uint8 c) and nothin print to host PC I think CYGACC_COMM_IF_PUTC is setted in cyg_hal_plf_scif_init(int scif_index, int comm_index, int rcv_vect, cyg_uint8* base) { | | // Initialize channel procs CYGACC_CALL_IF_SET_CONSOLE_COMM(comm_index); comm = CYGACC_CALL_IF_CONSOLE_PROCS(); CYGACC_COMM_IF_CH_DATA_SET(*comm, chan); CYGACC_COMM_IF_WRITE_SET(*comm, cyg_hal_plf_scif_write); CYGACC_COMM_IF_READ_SET(*comm, cyg_hal_plf_scif_read); CYGACC_COMM_IF_PUTC_SET(*comm, cyg_hal_plf_scif_putc); CYGACC_COMM_IF_GETC_SET(*comm, cyg_hal_plf_scif_getc); CYGACC_COMM_IF_CONTROL_SET(*comm, cyg_hal_plf_scif_control); CYGACC_COMM_IF_DBG_ISR_SET(*comm, cyg_hal_plf_scif_isr); CYGACC_COMM_IF_GETC_TIMEOUT_SET(*comm, cyg_hal_plf_scif_getc_timeout); // Restore original console CYGACC_CALL_IF_SET_CONSOLE_COMM(cur); } and both cases execute this routine at starting time. all points considered,converge to next part. hal_if_diag_write_char(char c) { hal_virtual_comm_table_t* __chan = CYGACC_CALL_IF_CONSOLE_PROCS(); here, I am sorry my spirit collapsed. Do you think this part happens to be any cause of my trouble? Please enlighten me. Masahiro Ariga -- Below is my first question. > I tested and confirmed that it worked, > when I loaded ROM-reserved application using "fis load" > and executed "go" command manually(that is, entered commands at > RedBoot prompt). > > But when I tried to do the same thing on Boot Script, > application never ran !! > > Strangely,if I write only "fis load" on Script,execute Script, > and after that I enter "go" command manually and execute, > then application properly run. > > I wonder what is difference between excuting "go" manually > and on Boot Script. > > I tried some delays before "go", but no effect. > > I post both outputs,and "fconfig" entering log. > > first only execute "fis load" on Script, > ------------------ > My Flash ID is 4:22f9:19:0 > config=0x8ffee000 cfg_base=0xa03ff000 > Ethernet eth0: MAC address 00:40:31:08:01:00 > IP: 0.0.0.0/255.255.255.0, Gateway: 0.0.0.0 > Default server: 0.0.0.8, DNS server IP: 0.0.0.8 > > RedBoot(tm) bootstrap and debug environment [ROM] > Non-certified release, version v2_0 - built 13:16:32, Jul 20 2007 > > Platform: inserter (SH 7709S) > Copyright (C) 2000, 2001, 2002, Red Hat, Inc. > > RAM: 0x8c000000-0x90000000, 0x8c00afa0-0x8ffed000 available > FLASH: 0xa0000000 - 0xa0400000, 64 blocks of 0x00010000 bytes each. > == Executing boot script in 3.000 seconds - enter ^C to abort > RedBoot> fis load -b 0x8c010000 basic1 > RedBoot> > ------------------ > > then,enter "go" manually,and application ran, > ------------------ > RedBoot> go 0x8c010000 > Network stack using 65536 bytes for misc space > 65536 bytes for mbufs > 131072 bytes for mbuf clusters > [cyg_net_init] Init: mbinit(0x00000000) > [cyg_net_init] Init: cyg_net_init_devs(0x00000000) > Init device 'lan91cxx_eth0' > [cyg_net_init] Init: loopattach(0x00000000) > [cyg_net_init] Init: ifinit(0x00000000) > IFP: 0x8c0427e0, next: 0x8c0904d8 > IFP: 0x8c0904d8, next: 0x00000000 > [cyg_net_init] Init: domaininit(0x00000000) > [cyg_net_init] Init: cyg_net_add_domain(0x8c0431d4) > New domain internet at 0x00000000 > [cyg_net_init] Init: cyg_net_add_domain(0x8c042c5c) > New domain route at 0x00000000 > [cyg_net_init] Init: cyg_route_init(0x00000000) > [cyg_net_init] Done > Hello eCos World!!! > > Thread A, count: 1 message: 75 > Thread A, count: 2 message: 75 > Thread B, message: 68 > ------------------ > > then,excute both commands on Script, > Application never ran, > ------------------ > My Flash ID is 4:22f9:19:0 > config=0x8ffee000 cfg_base=0xa03ff000 > Ethernet eth0: MAC address 00:40:31:08:01:00 > IP: 0.0.0.0/255.255.255.0, Gateway: 0.0.0.0 > Default server: 0.0.0.8, DNS server IP: 0.0.0.8 > > RedBoot(tm) bootstrap and debug environment [ROM] > Non-certified release, version v2_0 - built 13:16:32, Jul 20 2007 > > Platform: inserter (SH 7709S) > Copyright (C) 2000, 2001, 2002, Red Hat, Inc. > > RAM: 0x8c000000-0x90000000, 0x8c00afa0-0x8ffed000 available > FLASH: 0xa0000000 - 0xa0400000, 64 blocks of 0x00010000 bytes each. > == Executing boot script in 3.000 seconds - enter ^C to abort > RedBoot> fis load -b 0x8c010000 basic1 > RedBoot> go 0x8c010000 -w 5 > About to start execution at 0x8c010000 - abort with ^C within 5 seconds > ------------------ > > next is "fconfig" entering log, > ------------------ > RedBoot> fconfig > Run script at boot: true > Boot script: > .. fis load -b 0x8c010000 basic1 > Enter script, terminate with empty line >>> fis load -b 0x8c010000 basic1 >>> go 0x8c010000 -w 5 >>> > Boot script timeout (1000ms resolution): 3 > Use BOOTP for network configuration: false > Gateway IP address: > Local IP address: > Local IP address mask: 255.255.255.0 > Default server IP address: 0.0.0.8 > Console baud rate: 38400 > DNS server IP address: 0.0.0.8 > GDB connection port: 9000 > Force console for special debug messages: false > Network hardware address [MAC]: 0x00:0x40:0x31:0x08:0x01:0x00 > Network debug at boot time: false > Update RedBoot non-volatile configuration - continue (y/n)? y > ... Erase from 0xa03f0000-0xa0400000: . > ... Program from 0x8ffef000-0x8ffff000 at 0xa03f0000: . > RedBoot> > ------------------ > > My Application is a sample program in Anthony J. Massa's "Embedded > Software Development with eCos". -- Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss