2014年3月20日 星期四

離職前擺爛是對的?

半年內部門一半人離職,我才發覺原來大部分人離職前擺爛,程度各有不同。
記得前公司,從我提出離職,就先趕手上工作到各一段落。
先依部長需求找人交接,沒有交代的部分,若是交接人不收,就另外找人交接。
再來是交接工作文件,光是寫文件就花了不少時間。
我的態度是:不要因個人離開,使工作斷,或是找不到程式。
所以到最後半天,才有空。因為電腦及文具都交出來了,真的沒有可以做的。

現在才發現,沒多少人這樣做。
離職提出就擺爛,別人因為工作做不下去就會自己接走,這是一般人的想法。
本以為管理主管會比較好,結果也一樣。
看到主管是這樣,心想我就算以後在別的公司再遇到這樣的人,絶不會一起工作,更不用說有工作機會介紹。
因為離職不是一個工作的結束,而是工作移轉的態度。
也許我將工作和個人成就看成一體。
但一般人工作就只是工作,換工作和個人無關。
可是換工作是不可能重回,老闆一般也不會去搭關係。可是同事在離職後仍是朋友,有好機會還是會在別家公司再見面。
所以離職只是人際關係上的改變,並不是切斷。
這也就是,為何有人老是有新工作等。而一般人為了找新工作而拼命。
因為工作交接做得好,其他人有好機會,一定會先找工作交接好的人來。
而工作交接擺爛的人,從本質上就是切斷,有機會也不會想到已經切斷的人。

以上只是個人想法。

2014年3月19日 星期三

RTOS Task無限迴圈內是什麼?

使用RTOS中的Task等同使用一個新的執行單元,所以除了初始化程序,再來就是一個無限迴圈了。
實際使用上,因為絶大部分不會執行Kill Task的狀況下,最好用的模型就是狀態機了。
也就是用switch case做狀態控制,使用狀態變數顯示工作狀態。
基於這個模型,使用Coroutine也相同,這也是PhotoThreads可以使用的原因。
Task和Coroutine皆使用狀態機做最上層控制,所以是可以互轉。
也就是架構對了,有沒有使用作業系統,其程式結構是相似的。
可以自由調整架構及大小,對於MCU軟體元件共用的很大的幫助。
必竟可以重覆使用軟體,可以省下很多開發時間。

2014年3月18日 星期二

64位元電腦流行後的MCU

明年(2015)開始,手機進入64位元時代。報導預計2018年就差不多過半手機使用64位元。
PC已經差不多都是用64位元了。
也就是使用32位元的只會剩下MCU。
32位元MCU開發也會進入新局面。基本上在PC上模擬應會變成主流。
各式軟體及硬體元件也幾乎可以在PC上做好。上MCU只是功能測試。
PC也未必使用完整Compiler軟體,On-Line Compiler會變成新趨勢,這是因應平板及手機上開發的需求。
MCU上開發軟體和軟體工程相近,基本動作是在拼裝軟體元件。
工程師新的技術將會移轉到如何使模擬器和MCU的結果盡可能相同。
也就是在PC上使用32位元模式,要和MCU的32位元執行是相近的。
而PC環境是和MCU不同,為了相似,使用作業系統將二邊環境拉近是必須。
另一個是MCU有可能多核?非常可能。
原先手機上32位元多核CPU可以修改為MCU。因為價格及週邊多會進入MCU市場內。
多核MCU的操作又會變成新技術。此時有無作業系統已不是選擇,變成是必須。
在MCU的設計上已經變成不是重點,MCU能做成的產品市場才是重點。
MCU的使用,會變成以軟體為主要工作。因為硬體可以選擇太多,已經不是關鍵。
在工程師等級上,也會呈現M型分布。只能使用8位元及可以使用32位元會明顯區隔開來。自然會反應在薪資上。

MCU和PC其實已經模糊了。或是說MCU已追上PC的腳步,只是應用上不同。
最後MCU也可能只是電腦應用的的一個分支。

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);
}