2011年5月18日 星期三

CallBack Function on ThreadX

顧名思義,這個函數是不會主動執行的,如在嵌入式系統中,可以用來當DEBUG。
  • void ManagerInit(void) (初始化Manager管理員)
{
//產生一個線程來負責管理員
    tx_result = tx_thread_create( &test_thread,
            "test_thread",
            (void(*)(ULONG)) TestManager,
            0,
            test_stack,
            TEST_STACK_SIZE,
            THR_PRI_NORMAL,
            THR_PRI_NORMAL,
            DEFAULT_TIME_SLICE,
            TX_AUTO_START );
    XASSERT( TX_SUCCESS == tx_result, tx_result );

    // 產生一個消息隊列來處理消息
    tx_result = tx_queue_create(&fuser_queue,
            "test_queue",
            SYS_MSG_SIZE,
            fuser_messages,
            sizeof(MESSAGE) * NUM_TEST_MESSAGES);
// (向系統註冊,名稱TEST,函數TestDebugCallback)

dbg_register_cmd( "Test", TestDebugCallback);
}

  • static void TestManager(UINT unused) (產生一個Manager負責處理)
{
 ...
    while(1)
    {
//等待消息
        tx_result = tx_queue_receive(&test_queue,
                &msg,
                TX_WAIT_FOREVER);
//當消息來的時候,負責處理
          switch(msg.type)
        {
            case TEST_COMMAND_SET:
                {
                    break;
                }
...
  • static int TestDebugCallback( int argc, char *argv[] )(使用者透過Terminal和這個Callback函數,就可以和管理員溝通,進而達到測試的功能。)
{
    if( argc < 2 )
    {
        DPRINTF( (DBG_LOUD|DBG_OUTPUT), ("Supported commands:\n") );
        DPRINTF( (DBG_LOUD|DBG_OUTPUT), ("Test set 500 \n") );
        return 0;
    }
    else
    {
//使用者輸入Test set
        if ( strncmp( argv[1], "set", 4 ) == 0 ) {
            msg.type = TEST_COMMAND_SET;
            str_mkint(argv[2], &msg.data);
            }
.........
//將指令傳到消息隊列,再由管理員根據指令來處理。
        tx_res = tx_queue_send( &Test_queue,
                            &msg,
                            TX_NO_WAIT );
以下是使用者透過COM PORT6呼叫CallBack函數將指令TEST set傳給管理員。

note for Fat File System

最近在研讀檔案系統(file system)的程式碼,
1.  支援 FAT 12,16,32
 根據WIKI的定義: 
檔案配置表英語File Allocation Table首字母縮略字:FAT)又稱文件分配表,是一種由微軟發明並擁有部份專利[2]文件系統,供MS-DOS使用,也是所有非NT核心的微軟視窗使用的檔案系統。
FAT文件系統考慮當時電腦效能有限,所以未被複雜化,因此幾乎所有個人電腦作業系統都支援。這特性使它成為理想的軟碟記憶卡檔案系統,也適合用作不同作業系統中的資料交流。
但FAT有一個嚴重的缺點:當文件刪除後寫入新資料,FAT不會將檔案整理成完整片段再寫入,長期使用後會使檔案資料變得逐漸分散,而減慢了讀寫速度。磁碟重組是一種解決方法,但必須經常重組來保持FAT文件系統的效率。



這也是MSDOS和CP/M(想當年,有摸過) 的唯一差異.

2. BPB (BIOS Parameter Block)BIOS 參數區塊
struct fat_bpb_s
{
    char      xt_bs_jmpboot[3];
    char      xt_bs_oemname[8];
    char      xt_bpb_bytespersec[2];
    char      xt_bpb_secperclus;
    char      xt_bpb_resvdseccnt[2];
    char      xt_bpb_numfats;
    char      xt_bpb_bootentcnt[2];
    char      xt_bpb_totsec16[2];
    char      xt_bpb_media;
    char      xt_bpb_fatsz16[2];
    char      xt_bpb_secpertrk[2];
    char      xt_bpb_numheads[2];
    char      xt_bpb_hiddsec[4];
    char      xt_bpb_totsec32[4];
    union _diffpart{
            struct _fat1216
            {
                char      xt_bpb_drvnum;
                char      xt_bpb_reserved1;
                char      xt_bpb_bootsig;
                char      xt_bpb_volid[4];
                char      xt_bpb_vollab[11];
                char      xt_bpb_filsystype[8];
            }xt_fat1216;
            struct _fat32
            {
                char      xt_bpb_fatsz32[4];
                char      xt_bpb_extflags[2];
                char      xt_bpb_fsver[2];
                char      xt_bpb_bootclus[4];
                char      xt_bpb_fsinfo[2];
                char      xt_bpb_bkbootsec[2];
                char      xt_bpb_reserved[12];
                char      xt_bpb_drvnum;
                char      xt_bpb_reserved1;
                char      xt_bpb_bootsig;
                char      xt_bpb_volid[4];
                char      xt_bpb_vollab[11];
                char      xt_bpb_filsystype[8];
            }xt_fat32; 
        }xt_diff;
}

3.如何使用人家建好的LIB呢(呼叫API)?
  • include api.h 
  • call init() (作初始化)
  • ret = media_open( drive_letter, media_driver_ptr, driver_info_ptr ); (儲存媒體,如SD)如果成功傳回OK
    • drive_letter:  磁碟機的名字,如“F"。
    • media_driver_ptr:  function pointer指向media
    •  driver_info_ptr: piece of data
  • ret = media_format( media_handle, volume_label );(格式化,可作可不作,會把資料破壞)
  • ret = file_system_open( drive_letter );(開啟檔案系統)
    • file_handle_t* fp;
    • error_type_t e_res;
    • e_res = fat_file_open( filename, mode, &fp );
  • ret = media_and_filesystem_close( filesystem );(關閉檔案系統)

2011年5月16日 星期一

TomCat 5.5 + Eclipse 初體驗

這是我開始學習的出處
http://plato.acadiau.ca/courses/comp/dsilver/2513/eclipseandtomcattutorial/
從Step 1. Install Java 2 Platform, Standard Edition (J2SE)
到Step 7. Create a new Tomcat Project
都蠻順利地完成。
當作到 Step 8. Create and execute a JSP
問題出現了:


按下“Start Tomcat"之後。錯誤出來了。



Binding Error:表示原來的PORT有人在用。
執行:"netstat -nab" 在DOS下。
發現:


唉,怎麼tomcat5.exe已經在跑了?
看一下電腦的”服務“

應該是安裝時把它裝成Service了,趕快把他停掉。
再重新按下“Start Tomcat"。


Server起來了。
執行
5.Open a web browser and go to the URL http://localhost:8080/TomcatProject/JSPDemo.jsp


哇有錯!
看一下Http://localhost:8080


Server OK。那問題在哪?