2014年1月16日 星期四

ucgui於VS2010下編譯

取得3.90版本,發現有Simulation。在VS2010下卻編不出來。

有幾個問題:

1.  FiveChess.c找不到iostream.h
    解法: 直接註解掉
    因為這是C的寫法,VC6可以,但VS2010不行要改用namespace。不過沒有用到,所以直接註解掉。
   
2.  Linker找不到LIBC.lib
    解法: 修改propreites設定
    Linker->Input->Ignore Specific Default Library
    將內容libcmt.lib改為LIBC.lib
       
3.  Debugger找不到執行檔
    解法: 修改propreites設定
    Linker->General->Output File
    將內容Simulation.exe改為SimulationShip.exe
   
執行可以見到畫面了。

2013年12月23日 星期一

MCU可裁切式IO才是主流

並不是使用ST系列的MCU習慣了,而是每次想換總是差了一點功能。
各家CM4F其基本結構差不多,常用週邊也是差不多。
但是ST系列有些特性是比別家的好,自然就用得多。

1.  Pin腳高度相容
    使得在設計上,可以做Cost Down及Function Up方便得多。

2.  豐富週邊
    許多內建週邊,就算不用,pin腳也可用做其他用途。
    內建未用週邊,在未來性上,使工程師安心,也會使工程師開始想如何來利用。

3.  平衡性
    許多公司都有做到可外接SDRAM等功能。但整體配合性以ST較為平衡。
    這可能和週邊豐富性是正相關,在使用及調度上方便許多。
   
但豐富也可能引入其他副效應,就商業行為而言,先吸引使用者才是第一重點。   

2013年11月13日 星期三

HEX轉成BMP檔

也是J-Link取得的HEX資料,轉成影像格式,用來檢查資料。

#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <windows.h>

#define  SIZE                (0x1000000)
#define  WIDTH                (672)
#define  WIDTH_ALIG            ((-(WIDTH))&0x3)
#define  HEIGHT                (6144)
#define  BMP_OFFSET         0x436
#define  BMP_SIZE           ((WIDTH+WIDTH_ALIG)*HEIGHT+BMP_OFFSET)

unsigned char data[SIZE];
unsigned char image[BMP_SIZE];
FILE *src;
FILE *dest;

unsigned int  *p_color;
unsigned char *p_data;
unsigned char *p_src;
BITMAPFILEHEADER    *p_FileHeader;
BITMAPINFOHEADER    *p_InfoHeader;
// unsigned char d0,d1;

unsigned char B2bin(unsigned char *x)
{
    int t;
    int i;
    unsigned short r;

    r = 0;
    for ( i=0; i<2; i++ )
    {
        if ( *x <= '9' )
        {
            t = (*x-'0');
        }
        else
        {
            t = (*x-'A'+0xA);
        }
        r = (r<<4) + t;
        x++;
    }
    return r;
}

unsigned short W2bin(unsigned char *x)
{
    int t;
    int i;
    unsigned int r;

    r = 0;
    for ( i=0; i<4; i++ )
    {
        if ( *x <= '9' )
        {
            t = (*x-'0');
        }
        else
        {
            t = (*x-'A'+0xA);
        }
        r = (r<<4) + t;
        x++;
    }
    return r;
}

void main(void)
{
    int  i,j,n;
    char temp[80];
    int  byte_count;
    unsigned short address;
    int  record_type;
    int  flag;
    unsigned int img_address;

    p_FileHeader = (BITMAPFILEHEADER*)&image[0];
    p_InfoHeader = (BITMAPINFOHEADER*)&image[0xE];
    p_color    = (unsigned int *)&image[0x36];
    p_data     = &image[BMP_OFFSET];

    p_FileHeader->bfType = 'B' | ('M'<<8);
    p_FileHeader->bfSize = WIDTH*HEIGHT+BMP_OFFSET;
    p_FileHeader->bfOffBits = BMP_OFFSET;

    p_InfoHeader->biSize   = 40;
    p_InfoHeader->biWidth  = WIDTH;
    p_InfoHeader->biHeight = HEIGHT;
    p_InfoHeader->biPlanes = 1;
    p_InfoHeader->biBitCount = 8;
    p_InfoHeader->biCompression = 0;
    p_InfoHeader->biSizeImage = (WIDTH+WIDTH_ALIG)*HEIGHT;
    p_InfoHeader->biXPelsPerMeter = 0;
    p_InfoHeader->biYPelsPerMeter = 0;
    p_InfoHeader->biClrUsed = 0;
    p_InfoHeader->biClrImportant = 0;

    for (i=0; i<0x100; i++)
    {
        p_color[i] = (i<<16) | (i<<8) | i;    // set gray pattern
    }

    src = fopen("memory.hex", "rb");
    fread(data,1,SIZE,src);
    fclose(src);
    p_src = &data[0];
    temp[0] = 0;
    flag = 1;
    while ( flag )
    {
        sscanf(p_src,"%s",temp);
        n = strlen(temp);
        if ( n == 0 )
        {
            break;
        }
//        printf("%s\n",temp);
        if (':' != temp[0]) continue;
        byte_count = B2bin(&temp[1]);
        address    = W2bin(&temp[3]);
        record_type= B2bin(&temp[7]);
        switch ( record_type )
        {
        case 0:  // data record
            for( j=0; j<byte_count; j++ )
            {
                p_data[img_address+address+j] = B2bin(&temp[9+j*2]);
            }
            break;
        case 1:  // end
            flag = 0;
            break;
        case 4:  // relocate
            img_address = ((W2bin(&temp[9]) & 0xfff)<<16);
            break;
        default:
            break;
        }
        // reset var.
        p_src += (n+2);
        temp[0] = 0;
    }

    dest = fopen("CIS.bmp", "wb");
    fwrite(image, 1, BMP_SIZE, dest);
    fclose(dest);
}

HEX轉成文字檔

J-Link取得資料,在PC上存成HEX格式。
寫了小程式轉成資料,可以用於Excel上看。

#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <windows.h>

#define  SIZE                (0x1000000)
#define  MEM_SIZE            (0x10000)

unsigned char data[SIZE];
unsigned char image[MEM_SIZE];
FILE *src;
FILE *dest;

unsigned char *p_data;
unsigned char *p_src;

unsigned char B2bin(unsigned char *x)
{
    int t;
    int i;
    unsigned short r;

    r = 0;
    for ( i=0; i<2; i++ )
    {
        if ( *x <= '9' )
        {
            t = (*x-'0');
        }
        else
        {
            t = (*x-'A'+0xA);
        }
        r = (r<<4) + t;
        x++;
    }
    return r;
}

unsigned short W2bin(unsigned char *x)
{
    int t;
    int i;
    unsigned int r;

    r = 0;
    for ( i=0; i<4; i++ )
    {
        if ( *x <= '9' )
        {
            t = (*x-'0');
        }
        else
        {
            t = (*x-'A'+0xA);
        }
        r = (r<<4) + t;
        x++;
    }
    return r;
}

void main(void)
{
    int  i,j,n;
    char temp[80];
    int  byte_count;
    unsigned short address;
    int  record_type;
    int  flag;
    unsigned int img_address;
    int  first_address_flag = 0;
    unsigned int first_address;
    unsigned short *w_data;

    p_data     = &image[0];
    src = fopen("memory.hex", "rb");
    fread(data,1,SIZE,src);
    fclose(src);
    p_src = &data[0];
    temp[0] = 0;
    flag = 1;
    while ( flag )
    {
        sscanf(p_src,"%s",temp);
        n = strlen(temp);
        if ( n == 0 )
        {
            break;
        }
//        printf("%s\n",temp);
        if (':' != temp[0]) continue;
        byte_count = B2bin(&temp[1]);
        address    = W2bin(&temp[3]);
        record_type= B2bin(&temp[7]);
        switch ( record_type )
        {
        case 0:  // data record
            if(! first_address_flag )
            {
                first_address = img_address + address;
                first_address_flag = 1;
            }
            for( j=0; j<byte_count; j++ )
            {
                p_data[img_address+address+j-first_address] = B2bin(&temp[9+j*2]);
            }
            break;
        case 1:  // end
            flag = 0;
            break;
        case 4:  // relocate
            img_address = ((W2bin(&temp[9]))<<16);
            break;
        default:
            break;
        }
        // reset var.
        p_src += (n+2);
        temp[0] = 0;
    }
    dest = fopen("audio.csv", "w");
    w_data = (unsigned short *) &image[0];
    for( i=0; i<MEM_SIZE/2; i++)
    {
        if(*w_data == 0 ) break;
        fprintf(dest,"%d\n",*w_data);
        w_data++;
    }
//    fwrite(image, 1, MEM_SIZE, dest);
    fclose(dest);
}

2013年11月6日 星期三

Cortex M系列開始進入Tick-Tock時代

Intel的Tick-Tock策略是成就CPU帝國的重要推手。
沒想到Cortex-M也開始進入這樣的時代。

在今年(2013)年Cortex-M4進入火熱競爭的狀況下,在推展上很快進入價格戰。
也就是功能性推展(Tick)戰正在進行中。但Cost Down(Tock)也已經展開。
可是面對硬體價格低,功能卻不斷增加,但應用推展卻是緩慢的狀況下。
各廠商開始意識到,客戶是無法一口氣能夠控制複雜功能MCU。
韌體開始元件化,而硬體設定簡單化成為目前推展上的重點。

整合開發工具的方便性將會拉開Cortex-M系列和其他MCU開發上的差距。
也就是使用Cortex-M系列的工程師在圖型化界面拉一拉,就可以設定好MCU的工作模式。
反觀傳統MCU還在工程師一行行寫程式的狀況下,產能會逐漸拉開。

MCU功能多樣化,韌體元件化,程式資源的豐富性,PC資源連接。等等加速拉開Cortex M和傳統MCU之間的距離。
價格成為最後的底線,只要Cortex-M壓到多低,傳統MCU就只能更低。
而學MCU不是一二年可以成的,若是學傳統MCU只能在NT10元以下的MCU市場寫程式,可想而知薪水也高不起來。

Tick-Tock的出現,時代轉變。MCU的下一步?
還在觀察!

2013年10月6日 星期日

舊文章搬過來了。

總算搬成功了。文章有搬過來。
另一個隨意窩的也好了。不過那邊的不會主動去更新。
還是留一個連結:
通通都是半路出家

2013年10月3日 星期四

32位元MCU軟體的改變



8位元MCU最大的問題在ADC/DAC超過8位元後,取值及計算效能會下降。因為每筆資料皆需多次ALU計算。
16位元MCU則無此問題。它的問題是遇到32位元MCU
8位元MCU多半沒有IP付費,應是說沒有利潤去買,不如自己做。
理論上16位元也是如此,但16位元自認為價格應高於8位元,價格不願低。
然後,32位元MCU突然在三年內劇降,直接壓縮了市場,價格直逼8位元。
16位元變成沒有空間。比價格比省電,不如8位元,比效能不如32位元。
再來是32位元不僅是核心快,週邊多到爆。幾乎和PDA接近。

更恐怖的是軟體,不用修改下,以前DOS程式近乎直接移。
這種軟體方便性不是8位元/16位元可以做到的。
PC程式及資料相通,程式開發快且功能多。
32位元MCUMCU是一場革命。
是一場軟體工程師對嵌入式系統主導設計的使用習慣變革。
大部分硬體信號可以由MCU內部軟硬體結構出來。
ADC/DAC精密度提高,使得濾波器可以使用軟體來做。
Flash容量一下子到1MB以上,多到可以做磁碟機來用。
一但檔案系統出現,連資料庫都可以放進去。
8/16位元要做,程式有得大改。
且大部分PC上的軟體多以作業系統下做主。
移到8/16位元會是大工程。
32位元因有RTOS,所以問題小很多。
RTOS也有8/16位元,但因效能及RAM空間不足,安裝後不會有好表現。

MCU市場因使用慣性,不會馬上變化。
不過一但原先16位元可以用的應用,32位元會以優勢周邊攻入。
可能會有巨大資料儲存器,無線通信功能等等。

所以說像是PDA
也可以說MCU正在PDA化,且價格不變。
MCU工程師也要進化為PDA工程師,不然就會變成傳統工程師,不再有價值。
這波革命是新的,軟體工程師正在工業化,變成勞工。若不升級,難保工程師之名。