2019年8月13日 星期二

[Linux] Binary Link

簡述:

城市中有時會用到一大塊的二進位資料, 有幾種方法可以處理. 或是把它轉成 C 的原始檔, 不過這樣會犧牲處存空間及編譯的時間. 在 Linux 上, 可以用 ld 搭配程式中使用巨集, 可以做到二進位資料的直接鏈結, 不需要先轉成原始碼再編譯.

二進位檔轉成原始檔:

$ xxd –i image_src.jpg > image_src.h


範例:

以下以 image_src.jpg 作為 二進位資料檔

二進位資料處理:

$ ld –r –b binary –o image_src.o image_src.jpg

這時就會把 image_src.jpg 的內容, 放到 image_src.o 裡面, 如果有好幾個輸入檔, 可以連續輸入

$ ld –r –b binary –o image_src.o image_src_1.jpg image_src_2.jpg

檢視目的檔 (*.o) 中的二進位資料符號:

$ objdump –t image_src.o

可以看到如下的資料, 這些就是在資料連結階段所參考到的符號

SYMBOL TABLE:
0000000000000000 l    d  .data    0000000000000000 .data
0000000000000000 g       .data    0000000000000000 _binary_image_src_jpg_start
000000000000c815 g       .data    0000000000000000 _binary_image_src_jpg_end
000000000000c815 g       *ABS*    0000000000000000 _binary_image_src_jpg_size

參考用巨集 :

#define EXT_SYMBOL(NAME) \
   extern const unsigned char _binary_ ## NAME ## _start[]; \
   extern const unsigned char _binary_ ## NAME ## _end[];
#define EXT_VARIABLE(NAME) \
   _binary_ ## NAME ## _start
#define EXT_LENGTH(NAME) \
   ((_binary_ ## NAME ## _end) - (_binary_ ## NAME ## _start))

2019年8月1日 星期四

[Linux] Timer

簡述:

測試 Linux 的 Timer 功能.

說明:

在 Linux 中, 我們可以用 setitimer 來設定 timer, 讓他在一段時間後去執行一個動作. 程式原型如下:

#include <sys/time.h>

int getitimer(int which, struct itimerval *value);
int setitimer(int which, const struct itimerval *restrict value, struct itimerval *restrict ovalue);

參數如下 :

  1. which: timer 種類
    • ITIMER_REAL 觸發 SIGALRM, 累計實際上經過的時間.
    • ITIMER_VIRTUAL 觸發 SIGVTALRM, 累計程序執行的時間.
    • ITIMER_PROF 觸發 SIGPROF, 累計程序執行的時間及系統時間.
  2. itimerval: timer 時間定義
    1. time.it_value 第一次觸發的時間
    2. time.it_interval 下一次觸發的時間間隔

注意 :

在 setitimer() 運作的時間 (timer 累計中), alarm(), sleep(), usleep() 均不能正常作用.

範例 :

struct sigaction sa;
struct itimerval timer;

memset(&sa, 0, sizeof(sa));
sa.sa_handler = &timer_handler;
sigaction(SIGALRM, &sa, NULL);
// SIGALRM, SIGVTALRM, SIGPROF

timer.it_value.tv_sec = 0;
timer.it_value.tv_usec = WAKE_INTERVAL;
timer.it_interval.tv_sec = 0;
timer.it_interval.tv_usec = WAKE_INTERVAL;

setitimer(ITIMER_REAL, &timer, NULL);
// ITIMER_REAL, ITIMER_VIRTUAL, ITIMER_PROF

[ NT98515] CROSSCOMPILE ECLIPSE PAHO MQTT C Client

簡述: 試著把 Eclipse Paho MQTT C client  移植到 NT98515 的平台, 並且測試驗證. 下載 source: git clone https://github.com/eclipse/paho.mqtt.c make: cmake $ cmake...