ビットでログを記録する
(見たままモードで記事を作るとはてな記法に変更できなかったので書き直しました)
ビットでログを記録するロジックを作ってみた。
C言語だが、少しだけオブジェクト指向っぽく。
typedef uint32_t LOG_VALUE_TYPE; #define HL_BIT_LOG_NUM (sizeof(LOG_VALUE_TYPE)*8) typedef struct T_HL_BIT_LOG_INF { uint16_t log_no_max; /* cvr log max */ uint16_t buf_size; /* buffuer size */ LOG_VALUE_TYPE *p_bits; /* bits data address */ } hl_bit_log_inf;
static LOG_VALUE_TYPE bit[HL_BIT_LOG_NUM] = { 0x00000001, 0x00000002, 0x00000004, 0x00000008, 0x00000010, 0x00000020, 0x00000040, 0x00000080, 0x00000100, 0x00000200, 0x00000400, 0x00000800, 0x00001000, 0x00002000, 0x00004000, 0x00008000, 0x00010000, 0x00020000, 0x00040000, 0x00080000, 0x00100000, 0x00200000, 0x00400000, 0x00800000, 0x01000000, 0x02000000, 0x04000000, 0x08000000, 0x10000000, 0x20000000, 0x40000000, 0x80000000, }; /** * @brief 初期化 * * @param p_bit_log_inf ビットログ管理構造体アドレス * @param p_bits ログバッファ * @param buf_size ログバッファサイズ * @param log_no_max ログNo最大値 * @return int 0:OK -1:NG */ int hl_bit_log_init(hl_bit_log_inf *p_bit_log_inf, LOG_VALUE_TYPE *p_bits, uint16_t buf_size, uint16_t log_no_max) { if (p_bit_log_inf != NULL) ; else return -1; if (buf_size < (log_no_max / (sizeof(uint8_t)))) ; else return -1; p_bit_log_inf->log_no_max = log_no_max; p_bit_log_inf->buf_size = buf_size; p_bit_log_inf->p_bits = p_bits; return 0; } /** * @brief 終了処理 * * @param p_bit_log_inf ビットログ管理構造体アドレス */ void hl_bit_log_del(hl_bit_log_inf *p_bit_log_inf) { p_bit_log_inf->log_no_max = 0; p_bit_log_inf->buf_size = 0; p_bit_log_inf->p_bits = NULL; } /** * @brief ログセット * * @param p_bit_log_inf ビットログ管理構造体アドレス * @param no ログNo * @return int 0:OK -1:NG */ int hl_bit_log_set(hl_bit_log_inf *p_bit_log_inf, uint16_t no) { int ret; if (no < p_bit_log_inf->log_no_max) { int y = no / HL_BIT_LOG_NUM; int x = no % HL_BIT_LOG_NUM; p_bit_log_inf->p_bits[y] |= bit[x]; ret = 0; } else { ret = -1; } return ret; } /** * @brief セットチェック * * @param p_bit_log_inf ビットログ管理構造体アドレス * @param no ログNo * @return int 1 : on セット 0 : off 未セット -1 : noが範囲外 */ int hl_bit_log_is_set(hl_bit_log_inf *p_bit_log_inf, uint16_t no) { int ret; if (no < p_bit_log_inf->log_no_max) { int y = no / HL_BIT_LOG_NUM; int x = no % HL_BIT_LOG_NUM; if ( (p_bit_log_inf->p_bits[y] & bit[x]) == 0 ) ret = 0; else ret = 1; } else { ret = -1; } return ret; }