- 9月 07 週五 201220:00
穿梭於 UTF-8 與 UTF-16 之間
- 9月 07 週五 201202:43
電影:鋼鐵英雄
- 9月 06 週四 201221:14
電影:即刻救援2(Taken 2)

(連恩大叔又出任務~這次是第二次)
(無聲無息繞背殺人法)
- 9月 03 週一 201222:28
英語慣用語(Idioms)
注意
Here you go. 拿去。(= Here you are.)
Here we go. 開始囉。
Here we are. 我們到囉。
Here we go again. (壞事)又來了。
There you go again. 你老毛病又犯了。
Here you go. 拿去。(= Here you are.)
Here we go. 開始囉。
Here we are. 我們到囉。
Here we go again. (壞事)又來了。
There you go again. 你老毛病又犯了。
- 9月 03 週一 201209:59
O_EXCL到底有什麼用
大陸論壇上找到的分享之
Problem:
目的:試圖open一個文件,若文件不存在就建立它。
open(pathname, O_RDWR | O_CREAT,0666);就不行吗?为什麼好多資料上說要加O_EXCL,說是唯一、單體的運動方式,不加難道就不是了嗎?不解
Problem:
目的:試圖open一個文件,若文件不存在就建立它。
open(pathname, O_RDWR | O_CREAT,0666);就不行吗?为什麼好多資料上說要加O_EXCL,說是唯一、單體的運動方式,不加難道就不是了嗎?不解
- 9月 02 週日 201222:31
電影:攔截記憶碼(Total Recall)

劇情簡介:菲利浦狄克短篇小說"We Can Remember It For You Wholesale"改編,曾在1990年改編成電影「魔鬼總動員」,由阿諾史瓦辛格主演,此次是二度搬上大銀幕。
道格拉斯奎德(柯林法洛 飾演)是一名新殖民地的工廠工人,然而在植入晶片記憶的過程中,卻意外挖掘出他曾是一名間諜的身世內幕,只是他記不得他為哪一邊工作?
(1990的版本是由"阿諾史瓦辛格"領銜主演)
- 9月 02 週日 201212:06
電影:聚魔櫃(THe Possession)

中文片名:聚魔櫃
( 根據真實故事改編...有大法師的影子)
(其實只看海報的話有異形的feel)
- 8月 31 週五 201221:43
電影:惡靈古堡V:天譴日

(了不起竟然能夠拍到第五集..看來第六集也快了)
- 8月 31 週五 201216:52
C/C++ Predefined Macros
寫程式經常會用到編譯器預先定義的巨集 (Predefined Macros),例如:__FILE__、__LINE__、__DATE__、__TIME__、__func__ 等。這些巨集有些是標準 C/C++ 語言所定義的,有些則是編譯器自行定義的。使用 GNU C/C++ 的人,可參考以下資料:
Predefined Macros (GNU C/C++)
這份資料所提到的 System-specific Predefined Macros 是指針對不同的系統平台 (arm、mips 等),編譯器所預先定義的特殊巨集。若想直接看看這些預先定義的巨集,可執行以下指令:
Predefined Macros (GNU C/C++)
這份資料所提到的 System-specific Predefined Macros 是指針對不同的系統平台 (arm、mips 等),編譯器所預先定義的特殊巨集。若想直接看看這些預先定義的巨集,可執行以下指令:
- 8月 31 週五 201216:47
dm365 緩衝queue的實現
偶然逛到別人的網站找到的
该实现中创建了两个队列,一个empty队列,用于存放预分配的缓冲区,也就是一个缓存池,另外一个是full队列。实际使用中,写者从empty队列中获取一个队列项,并将数据写入该队列项指定的地址,然后将该队列项放入full队列。读者从full队列中获得一个队列项,然后对这个队列项进行处理,处理完后将这个队列项重新放入empty队列中。
#include <osa_buf.h>
#include <string.h>
int OSA_bufDelete(OSA_BufHndl *hndl)
{
int status = OSA_SOK;
if(hndl == NULL)
return OSA_EFAIL;
status = OSA_queDelete(&hndl->emptyQue);
status |= OSA_queDelete(&hndl->fullQue);
return status;
}
int OSA_bufCreate(OSA_BufHndl *hndl, OSA_BufCreate *bufInit)
{
int status = OSA_SOK;
int i;
if(hndl == NULL || bufInit == NULL)
return OSA_EFAIL;
if(bufInit->numBuf > OSA_BUF_NUM_MAX)
return OSA_EFAIL;
memset(hndl, 0, sizeof(OSA_BufHndl));
status = OSA_queCreate(&hndl->emptyQue, bufInit->numBuf);
if(status != OSA_SOK) {
OSA_ERROR("OSA_bufCreate() = %d \r\n", status);
return status;
}
status = OSA_queCreate(&hndl->fullQue, bufInit->numBuf);
if(status != OSA_SOK) {
OSA_queDelete(&hndl->emptyQue);
OSA_ERROR("OSA_bufCreate() = %d \r\n", status);
return status;
}
hndl->numBuf = bufInit->numBuf;
for(i = 0; i < hndl->numBuf; i++) {
hndl->bufInfo[i].size = 0;
hndl->bufInfo[i].flags = 0;
hndl->bufInfo[i].timestamp = 0;
hndl->bufInfo[i].physAddr = bufInit->bufPhysAddr[i];
hndl->bufInfo[i].virtAddr = bufInit->bufVirtAddr[i];
OSA_quePut(&hndl->emptyQue, i, OSA_TIMEOUT_FOREVER);
}
return status;
}
int OSA_bufSwitchFull(OSA_BufHndl *hndl, int *bufId)
{
int status;
int newBufId;
status = OSA_bufGetEmpty(hndl, &newBufId, OSA_TIMEOUT_NONE);
if(status == OSA_SOK) {
if(*bufId != OSA_BUF_ID_INVALID)
OSA_bufPutFull(hndl, *bufId);
*bufId = newBufId;
}
return status;
}
int OSA_bufSwitchEmpty(OSA_BufHndl *hndl, int *bufId)
{
int status;
int newBufId;
status = OSA_bufGetFull(hndl, &newBufId, OSA_TIMEOUT_NONE);
if(status == OSA_SOK) {
if(*bufId != OSA_BUF_ID_INVALID)
OSA_bufPutEmpty(hndl, *bufId);
*bufId = newBufId;
}
return status;
}
该实现中创建了两个队列,一个empty队列,用于存放预分配的缓冲区,也就是一个缓存池,另外一个是full队列。实际使用中,写者从empty队列中获取一个队列项,并将数据写入该队列项指定的地址,然后将该队列项放入full队列。读者从full队列中获得一个队列项,然后对这个队列项进行处理,处理完后将这个队列项重新放入empty队列中。
#include <osa_buf.h>
#include <string.h>
int OSA_bufDelete(OSA_BufHndl *hndl)
{
int status = OSA_SOK;
if(hndl == NULL)
return OSA_EFAIL;
status = OSA_queDelete(&hndl->emptyQue);
status |= OSA_queDelete(&hndl->fullQue);
return status;
}
int OSA_bufCreate(OSA_BufHndl *hndl, OSA_BufCreate *bufInit)
{
int status = OSA_SOK;
int i;
if(hndl == NULL || bufInit == NULL)
return OSA_EFAIL;
if(bufInit->numBuf > OSA_BUF_NUM_MAX)
return OSA_EFAIL;
memset(hndl, 0, sizeof(OSA_BufHndl));
status = OSA_queCreate(&hndl->emptyQue, bufInit->numBuf);
if(status != OSA_SOK) {
OSA_ERROR("OSA_bufCreate() = %d \r\n", status);
return status;
}
status = OSA_queCreate(&hndl->fullQue, bufInit->numBuf);
if(status != OSA_SOK) {
OSA_queDelete(&hndl->emptyQue);
OSA_ERROR("OSA_bufCreate() = %d \r\n", status);
return status;
}
hndl->numBuf = bufInit->numBuf;
for(i = 0; i < hndl->numBuf; i++) {
hndl->bufInfo[i].size = 0;
hndl->bufInfo[i].flags = 0;
hndl->bufInfo[i].timestamp = 0;
hndl->bufInfo[i].physAddr = bufInit->bufPhysAddr[i];
hndl->bufInfo[i].virtAddr = bufInit->bufVirtAddr[i];
OSA_quePut(&hndl->emptyQue, i, OSA_TIMEOUT_FOREVER);
}
return status;
}
int OSA_bufSwitchFull(OSA_BufHndl *hndl, int *bufId)
{
int status;
int newBufId;
status = OSA_bufGetEmpty(hndl, &newBufId, OSA_TIMEOUT_NONE);
if(status == OSA_SOK) {
if(*bufId != OSA_BUF_ID_INVALID)
OSA_bufPutFull(hndl, *bufId);
*bufId = newBufId;
}
return status;
}
int OSA_bufSwitchEmpty(OSA_BufHndl *hndl, int *bufId)
{
int status;
int newBufId;
status = OSA_bufGetFull(hndl, &newBufId, OSA_TIMEOUT_NONE);
if(status == OSA_SOK) {
if(*bufId != OSA_BUF_ID_INVALID)
OSA_bufPutEmpty(hndl, *bufId);
*bufId = newBufId;
}
return status;
}

