半年內部門一半人離職,我才發覺原來大部分人離職前擺爛,程度各有不同。
記得前公司,從我提出離職,就先趕手上工作到各一段落。
先依部長需求找人交接,沒有交代的部分,若是交接人不收,就另外找人交接。
再來是交接工作文件,光是寫文件就花了不少時間。
我的態度是:不要因個人離開,使工作斷,或是找不到程式。
所以到最後半天,才有空。因為電腦及文具都交出來了,真的沒有可以做的。
現在才發現,沒多少人這樣做。
離職提出就擺爛,別人因為工作做不下去就會自己接走,這是一般人的想法。
本以為管理主管會比較好,結果也一樣。
看到主管是這樣,心想我就算以後在別的公司再遇到這樣的人,絶不會一起工作,更不用說有工作機會介紹。
因為離職不是一個工作的結束,而是工作移轉的態度。
也許我將工作和個人成就看成一體。
但一般人工作就只是工作,換工作和個人無關。
可是換工作是不可能重回,老闆一般也不會去搭關係。可是同事在離職後仍是朋友,有好機會還是會在別家公司再見面。
所以離職只是人際關係上的改變,並不是切斷。
這也就是,為何有人老是有新工作等。而一般人為了找新工作而拼命。
因為工作交接做得好,其他人有好機會,一定會先找工作交接好的人來。
而工作交接擺爛的人,從本質上就是切斷,有機會也不會想到已經切斷的人。
以上只是個人想法。
2014年3月20日 星期四
2014年3月19日 星期三
RTOS Task無限迴圈內是什麼?
使用RTOS中的Task等同使用一個新的執行單元,所以除了初始化程序,再來就是一個無限迴圈了。
實際使用上,因為絶大部分不會執行Kill Task的狀況下,最好用的模型就是狀態機了。
也就是用switch case做狀態控制,使用狀態變數顯示工作狀態。
基於這個模型,使用Coroutine也相同,這也是PhotoThreads可以使用的原因。
Task和Coroutine皆使用狀態機做最上層控制,所以是可以互轉。
也就是架構對了,有沒有使用作業系統,其程式結構是相似的。
可以自由調整架構及大小,對於MCU軟體元件共用的很大的幫助。
必竟可以重覆使用軟體,可以省下很多開發時間。
實際使用上,因為絶大部分不會執行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也可能只是電腦應用的的一個分支。
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
執行可以見到畫面了。
有幾個問題:
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較為平衡。
這可能和週邊豐富性是正相關,在使用及調度上方便許多。
但豐富也可能引入其他副效應,就商業行為而言,先吸引使用者才是第一重點。
各家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);
}
#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);
}
寫了小程式轉成資料,可以用於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);
}
訂閱:
文章 (Atom)