Sean's Note: 2010

2010年12月31日 星期五

[DM6437] 初學DSP

最近自己摸 TI 的 DM6437 DSP 真是有夠難上手了。

覺得 Output 怪怪的或 CCS 開不起來就按按 SW6 Reset 吧。

還有隨 DM6437 EVM 附的光碟,裡面有的 Driver 都很舊,有一些 bug,

可以的話就先更新,如:

DSP/BIOS: v5.31.02 -> v5.41.09.34
Code Generation Tools: v6.0.8 -> v6.1.18
DVSDK:  dvsdk_1_01_00_15 -> dvsdk_1_11_00_00


一些名詞的縮寫:
VPSS: Video Processing Subsystem
VPFE: Video Processing Font-end
CCDC: CCD Controller
VPFE: Video Processing Back-end
OSD: On-Screen Display
xDC: Express DSP Component
PSP: Platform Support Package

另外這兩個網站,可以找到許多相關資料。

TI Wiki:
http://processors.wiki.ti.com/index.php/Main_Page

TI Forum:
http://e2e.ti.com/support/dsp/davinci_digital_media_processors/f/default.aspx


關於最佳化:
http://processors.wiki.ti.com/index.php/C6000_CGT_Optimization_Lab_-_1

2010年12月20日 星期一

[C/C++] 動態宣告二維陣列

// ==========================

// C Style

// ==========================

int **p;
int i;


// 欲配置成 p[10][3]

p = (int **)malloc(10 * sizeof(int *));
for (i = 0; i < 10; i++){
    p[i] = (int *)malloc(3 * sizeof(int));

....

// 使用完後釋放記憶體空間
for (i = 0; i < 10; i++)
    free(p[i]);

free(p); 





// =========================

// C++ Style

// =========================

int **p; // 二維動態

// 欲配置成 p[10][3]
p = new int* [10];
for (int i = 0; i < 10; i++){
    p[i] = new int [3];

...


// 使用完後釋放記憶體空間
for (int i = 0; i < 10; i++)
    delete [] p[i];

delete [] p; 


int (*p)[3]; // 一維固定一維動態

// 欲配置成 p[10][3]
p = new int[10][3];
for (int i = 0; i < 10; i++){
    p[i] = new int [3];

...


// 使用完後釋放記憶體空間
delete [] p; 

2010年12月17日 星期五

[C/C++] 在Dev-C++安裝OpenCV2.0

(1)下載 OpenCV-2.0.0a-win32.exe
(2)安裝OpenCV2.0在C:\OpenCV2.0
(3)在DEV 工具/編譯器選項/編譯器 的編譯器設定組態中新增編譯器設定(加號按鈕)並命名為"OpenCV2.0"
(4)在連結器命令列中加入以下命令(前面框號要打勾)
-llibcxcore200 -llibcv200 -llibcvaux200 -llibhighgui200 -llibml200
(5)在DEV 工具/編譯器選項/目錄/二進位檔 加入:
C:\OpenCV2.0\bin
C:\Dev-Cpp\Bin
C:\Dev-Cpp\libexec\gcc\mingw32\3.4.2
(6)在DEV 工具/編譯器選項/目錄/函式庫 加入:
C:\OpenCV2.0\lib
C:\Dev-Cpp\lib
(7)在DEV 工具/編譯器選項/目錄/C引入檔 加入:
C:\OpenCV2.0\include\opencv
C:\Dev-Cpp\include
(8)在DEV 工具/編譯器選項/目錄/C++引入檔 加入:
C:\OpenCV2.0\include\opencv
C:\Dev-Cpp\lib\gcc\mingw32\3.4.2\include
C:\Dev-Cpp\include\c++\3.4.2\backward
C:\Dev-Cpp\include\c++\3.4.2\mingw32
C:\Dev-Cpp\include\c++\3.4.2
C:\Dev-Cpp\include
(9)在C:\OpenCV2.0\include\opencv中找到cxoperations.hpp檔
(10)找到檔中第66行部分程式碼如下
#else
#include <bits/atomicity.h>
#if __GNUC__ >= 4
(11)將它改成如下程式碼並儲存
#else
#include <bits/atomicity.h>
#if __GNUC__ >= 4 || __MINGW32__
(12)每次開新的專案必須在專案中選擇新建的編譯器設定(OpenCV2.0)


轉載自: http://yester-place.blogspot.com/2008/06/dev-copencv.html

2010年11月28日 星期日

Context Switch

當發生中斷時,作業系統必須暫存目前程序的 context,載入新程序的

context,而 context 是以 PCB (Process Control Block) 來表示。

PCB 包含了許多資訊如 :

Process state : new, ready, running, waiting, halted 等等。

Program counter : 存放下一行要執行的指令的位址。

CPU registers : 依不同的電腦架構而有不同,如 accumulators, stack pointers 等等。

CPU-scheduling information : 程序的優先權和排程的參數等等。

Memory-management information : page tables, segment tables 等等。

Accounting information : CPU 數量、程序數量等等。

I/O status information : 配置的 I/O 裝置和開啟的檔案。

什麼是 IP 分享器? Hub? Switch Hub?

IP 分享器
通常和電信業者申請 ADSL 的時候,只會給一個固定 IP,這時候家裡若想要多台
電腦同時上網,就必須透過 IP 分享器來分配虛擬 IP 給其他電腦,192.168.0.0 ~
192.168.255.255,而這些電腦都會統一透過 IP分享器上的固定 IP 與外界的 Internet
溝通。

Hub
這是假設 IP 分享器後面的埠只有 8 個,但想要連接 8 台以上的電腦,這時就可以
用 Hub ,就好像電腦主機只有兩三個 USB 埠,但想要接很多裝置時,就可以買一
個 USB Hub 來擴充。Hub 屬於半雙工,只收或送。


Switch Hub
與 Hub 相似,不同的是 Switch 的 port 會記錄每台電腦的 MAC,在傳輸封包時,
只會傳給擁有該 MAC 的電腦,不像單純的 Hub 是用廣播的方式。而且 Switch 是
屬於全雙工,可以同時傳送和接收資料,所以價格也比單純的 Hub 來的貴一點。



2010年11月24日 星期三

[C/C++] 常見的型態運算錯誤

char a = 200;
char b = 200;
int c;

c = a + b;
c 會是多少呢?

答案是 -112 而不是 400
因為 a 和 b 實際上都為 -56,所以 -56 + -56 = -112

2010年10月17日 星期日

[C/C++] structure and class

Class is equal to structure plus member function, but a C++ structure can do any thing a class can do!
Only their default access level are different.
Structure's fields are public by default.
Class fields are private by default.

2010年10月16日 星期六

[C/C++] Default Arguments

在 C++ 裡,函式中的參數是可以在定義的時候給初始值的 (C 不支援)。
// definition
void a (int b, int c = 1, int d = 1);

int main ()
{
    a(1, 2, 3);
    a(1, 2);
    a(1);
}

// implementation
void a (int b, int c, int d)
{
    ...
}

2010年10月15日 星期五

[BCB] 擷取檔案路徑與副檔名的函式

String str = "C:\\Program Files\\Borland\\CBuilder6\\Projects\\Project1.exe";

Label1->Caption = ExtractFileName(str);
// Project1.exe


Label2->Caption =  ExtractFilePath(str);   
 // C:\Program Files\Borland\CBuilder6\Projects\


Label3->Caption = ExtractFileDir(str);     
 // C:\Program Files\Borland\CBuilder6\Projects


Label4->Caption =  ExtractFileDrive(str);  
 // C:


Label5->Caption = ExtractFileExt(str);      
// .exe



2010年10月6日 星期三

[C/C++] Data structure alignment

通常 structure 中都會以 size 最大的成員作為 alignment 的單位,以提高運算效率。
以 struct A1 來說,最大為 double 所以 alignment 的單位為 8 bytes,
sizeof( struct A1) 就會是 4 + 4 + 8 + 8 = 24 bytes。
sizeof( struct A2) 就會是 4 + 4 + 8 + 1 + p(7)  + 8 = 32 bytes,
padding 了 7 bytes。
struct A1
{                            
    int a;  
    char b[12];
    double c;        
};

struct A2
{                              
    int a;    
    char b[13]; 
    double c;          
};
使用虛擬指令 #pragma pack(n) : 編譯器將按照 n bytes 對齊。
使用虛擬指令 #pragma pack() : 取消自定義對齊方式。
#pragma pack(2)
struct D
{                            
    int a;  
    char b;        
};
#pragma pack()
如果指定的 n 大於 structure 中成員的最大 size 將不起作用,仍依 size 最大的成員
進行對齊。sizeof( struct D) 就會是 4 + 1 + p(1) = 6 bytes。

2010年9月7日 星期二

[Windows] 更改 IE 同時下載個數的限制

IE 預設在同一個頁面只能同時下載兩個檔案,透過 regedit.exe 可以解除此限制。

到 Internet Settings 下新增 MaxConnectionPerServer 和 MaxConnectionPer1_0Server,

將其值皆設為 10 即可。


[Windows] 自訂桌面的位置

可以透過 regedit.exe 來修改桌面的位置。

刪掉原先的 WallpaperOriginX 和 WallpaperOriginX,再重新新增兩個一樣名稱但型態為

DWORD 的變數,值就依據想要的位置設定就行。要回復原先的設定,只要刪除兩個變

數,重新開機即可。

2010年9月6日 星期一

[C/C++] C++ 的 int 轉成 string class

#include <iostream>
#include <string>
#include <sstream>

using namespace std;

string int2str(int &);

int main(void) {
  
  int i = 1200;
  string s;
  s = int2str(i);

  cout << s << endl;
}

string int2str(int &i) {
  
  string s;
  stringstream ss(s);
  ss << i;

  return ss.str();
}

2010年8月20日 星期五

[BCB] Windows Hook

vkCode 跟 ASCII 不同,相關鍵盤的對應可到 MSDN 的 vkCode 查詢。

2010年8月19日 星期四

[C/C++] struct 宣告方式

// =====================
// 方法1: C 和 C++ 都可以用
// =====================
typedef struct Student
{
   int id;
   char* name;  
}Student;

Student student  = {1, "Sean"};

// =====================
// 方法2: C 和 C++ 都可以用 
// =====================
struct Student
{
   int id;
   char* name;    
};

typedef struct Student student;
Strudent student  = {1, "Sean"};

// ==============================
// 方法3: 不需 typedef 只有 C++ 可以用
// ==============================
struct Student
{
   int id;
   char* name;    
};

Strudent student  = {1, "Sean"};

2010年8月18日 星期三

電晶體又可分為 BJT 和 FET

電晶體又可分為
                                                                            /   射極 (Emitter)
雙載子接面電晶體 BJT(Bipolar Junction Transistor)   -   基極 (Base)
                                                                            \   集極 (Collector)





                                                            /    源極 (Source)
場效電晶體 FET(Field Effect Transistor)   -   閘極 (Gate)
                                                            \   汲極 (Drain)







2010年8月5日 星期四

[BCB] Memo 與 RichEdit

Memo 無法對每一行文字做不同的顏色,
用 RichEdit 則可以透過設定,RichEdit1->SelAttributes->Color = clBlue
來變換文字的顏色。

2010年8月4日 星期三

[STM32] 學習筆記

最近陪學弟玩 ARM 的 STM32,做了一些筆記,

1. jumpers 向內的腳位連接到核心晶片,朝外的腳位連結到了各個元件(LED、按鈕等)。

2. STM32 與 AVR 和 8051 不同的是,預設 0 (低電位) 為亮 LED, 1 (高電位) 為暗。

3. 要接按鈕的話,把 GPIO 腳位設定成 GPIO_Mode_IPD ( 輸入 Pull-Down ) ,

然後按鈕一端接 pin 腳一端接正,則 pin 腳預設值為 0 ,按下後電流通過變高電位為 1,

反之設成 GPIO_Mode_IPU ( 輸入 Pull-up ),則另一端要接地,按下後變為低電位為 0 。



2010年8月3日 星期二

[BCB] 設定 OpenDialog 開啟資料夾的起始位置

只透過設定 InitialDir ,每次開啟時還是會回到上次開啟檔案的目錄下,

還必須將 Options 下的 ofNoChangeDir 設成 true 才會每次都開啟設定好的位置。


2010年6月29日 星期二

[BCB] 定義自己的鼠標圖示

到 Tools -> Image Editor 就可以直接修改 res 檔的鼠標圖案,

更改完後存檔就可以使用,如果沒有更新,就把 res 檔從 project 從移除,

再 add 一次就行了。(不 add,也可以使用 )

0xfffffff0 ~ 0xffffffff 的位址已有內建的滑鼠圖示,

所以可以從 0x1 開始定義自己要對應的滑鼠圖示,

如下的範例 :

#pragma resource "Project1.res" //使用前要先引入 res

const int crDraw = 6;
HINSTANCE HInst;
HInst = reinterpret_cast<HINSTANCE>(HInstance);
// Load custom cursors for tools from extrares.res
// ABC 是 cusor 的名稱
Screen->Cursors[crDraw] = LoadCursor(HInst, "ABC"); 
Cursor = TCursor(crDraw);

2010年5月28日 星期五

[BCB] TStringList 的排序

TStringList *list = new TStringList();

// 原始內容 {"22", "211", "222", "33"};

list->Sort();


// Sort() 後的結果, 是依序比較字串開頭的大小 {211, 22, 222, 33};


// 想按數字大小排序 {22, 33, 211, 222};, 需用 CustomSort()
list->CustomSort(compare);


// 並自訂 compare function


int __fastcall compare(TStringList* List, int Index1, int Index2)
{
    if (StrToInt(List->Strings[Index1]) > StrToInt(List->Strings[Index2]))
      return 1;


    else if (StrToInt(List->Strings[Index1]) == StrToInt(List->Strings[Index2]))
      return 0;


    else
        return -1;
}

2010年4月24日 星期六

[BCB] 連結 MySQL 資料庫


想用 BCB 連結 MySQL 資料庫,可以到網路下載 SQLAPI++ 試用版,

藉由 SQLAPI++ 就不需要透過 ODBC 來連接,方便很多。

官網現在最新的版本是 2010/3/24 發佈的 3.7.31 版,

網路上有比較舊 2007/12/11 發佈的 3.7.23 破解版,

不過舊的版本要先執行 "SET NAMES big5" 指令,不然中文印出來會是亂碼。


另外,若要連線到遠端的 MySQL 資料庫,要注意兩點 :

1. 必須在 Server 端的防火牆,新增 MySQL 的連接埠 (MySQL 的預設值為 3306)。

2. 無法用帳號 root 遠端連線,必須另開帳號給予權限。  

2010年4月17日 星期六

[PHP] session: Cannot send session cache limiter - headers already sent...

用了 session_start();

Cannot send session cache limiter - headers already sent...

卻出現這樣的訊息,是因為在 session_start() 之前,

就已經有 ouput 東西到前端了, 有兩種方法可以解決.

1. 到 php.ini 裡把 output_buffer 設成 on,這樣 server 端

就會把所有的 output 放到 buffer 裡,在一次送到前端。

2.

ob_start(); // 加上這行

session_start();

2010年4月16日 星期五

[PHP] 上傳中文檔案的問題

如果用 notepad++ 編輯,注意要存成 utf-8 的格式,

另外要將上傳的完整路徑轉換成 big5,

<?

$upload_file = "../file/檔案.txt";

$upload_file = iconv("utf-8", "big5", $upload_file);

move_uploaded_file($_FILES["file"]["tmp_name"][$i], $upload_file);

?>

2010年4月15日 星期四

[PHP] 在網頁間傳遞參數

1. 不管是數字或字串直接加在變數後面,
  
     page.php?number=2
     page.php?name=Sean


2. 利用 form + hidden + POST

2010年3月9日 星期二

[BCB] 手動觸發 Event 事件

觸發按下 Button 有兩種方法,

1. Button1->Click();

2. Button1->OnClick(Button1);

觸發按下 UpDown 則需要多一個參數,用來辨別是下一頁還是上一頁,

// deffine 在 ComCtrls.hpp
// enum TUDBtnType { btNext, btPrev };

1. UpDown1->OnClick(UpDown1, btNext);

2010年1月17日 星期日

[BCB] ScrollBar 的 Enable

用 Property 視窗把 ScrollBar 的 Enable 設為 false,

好像只有在 Position 為 0 的時候可以,真怪。

只好在程式裡在寫一次 ScrollBar1->Enable = false;



2010年1月16日 星期六

[BCB] 三種方法讀取 pixel 中的 RGB

我用了一張 640x480 的圖片作測試。
// 方法一 : 0.016s
for (int i = 0; i < h; i++)
{
    ptr1 = (Byte*)Image1->Picture->Bitmap->ScanLine[i];

    for (int j = 0; j < w; j++)
    {

      b = ptr1[3*j];
      g = ptr1[3*j+1];
      r = ptr1[3*j+2];
   }

}
// 方法二 : 0.172s
  for (int i = 0; i < h; i++)
    for (int j = 0; j < w; j++)
    {
      color = Image1->Canvas->Pixels[j][i];
      b = (color&0xFF0000) >> 16;
      g = (color&0x00FF00) >> 8;
      r = (color&0x0000FF);
    }

// 方法三 : 0.515s
  for (int i = 0; i < h; i++)
    for (int j = 0; j < w; j++)
    {
      b = GetBValue(Image1->Canvas->Pixels[j][i]);
      g = GetGValue(Image1->Canvas->Pixels[j][i]);
      r = GetRValue(Image1->Canvas->Pixels[j][i]);
    }



結論是,最好是用指標作,要不然就自己切,絕對不要用內建的 GetRValue()  !

後記 :

TheBitmap->PixelFormat = pf32bit;

不論給多少,最好先給值,否則預設為 pfDevice ,這是依據顯卡目前的設定來處理,

而這會使得圖片處理的較慢

2010年1月12日 星期二

[Windows] 安裝 Office 2007 出現錯誤訊息

幫老師重灌電腦,要安裝 Office 2007 的時候,出現找不到 Enterprise.WW/... 的

錯誤訊息,結果把其中一條記憶體拔掉就可以了,真詭異,不知道是不是記憶

體壞了?


2010年1月9日 星期六

[C++/CLI] Input & Ouput

Input
字串:String^ line = Console::ReadLine();
字元:char ch = Console::Read();
數字:int value = Int32::Parse(Console::ReadLine());
鍵盤:ConsoleKeyInfo keyPress = Console::ReadKey(true); // true 即 No Display, flase 即 Display

Ouput
int packageCount = 1;
float packageWeight = 7.5;
Console::WriteLine(L"Packages:{0,3} Weight: {1,5:F2} pounds.", packageCount, packageWeight);
{n,w : Axx}: n - arg, w - field width, A - formatted, xx - precision

2010年1月7日 星期四

[C++/CLI] Visual C++ 2008 /MT 和 /CLR 的命令列選項不相容


[ 如果使用支援 /clr ]


[ 執行階段應選 /MD ]


[ 如果選擇 /MT 會有不相容的錯誤訊息產生 ]




以下取自微軟的 msdn :
/MD
會讓您的應用程式使用多執行緒及 DLL 專屬版本的執行階段程式庫。也會定義 _MT_DLL,讓編譯器將程式庫名稱 MSVCRT.lib 置入 .obj 檔案中。 以這個選項編譯的應用程式會以靜態方式連結到 MSVCRT.lib。這個程式庫會提供一層可以讓連結器解析外部參考的程式碼。實際的工作程式碼是包含在 MSVCRT.dll 中,它在執行階段時必須能提供給與 MSVCRT.lib 連結的應用程式使用。當 /MD 配合所定義 _STATIC_CPPLIB (/D_STATIC_CPPLIB) 使用時,它會讓應用程式與靜態的多執行緒 Standard C++ 程式庫 (libcpmt.lib) 連結,而不與動態版本 (msvcprt.lib) 連結,同時仍透過 msvcrt.lib 動態地連結至主要的 CRT。
/MT
會讓您的應用程式使用多執行緒靜態版本的執行階段程式庫。會定義 _MT,並讓編譯器將程式庫名稱 LIBCMT.lib 置入 .obj 檔案中,讓連結器能夠使用 LIBCMT.lib 解析外部符號。