// source code
#include <stdio.h>
typedef unsigned long ULONG;
typedef unsigned char UCHAR;
#define D_PIPE_MEM_BANK_RAW (3)
#define D_PIPE_MEM_BANK_Y (6)
#define D_PIPE_MEM_BANK_C (6)
#define D_PIPE_MEM_BANK_AEAWB (3)
#define D_PIPE_MEM_BANK_MAP (3)
#define D_PIPE_MEM_BANK_MAP_RGB (3)
#define D_PIPE_MEM_BANK_RGB (3)
#define D_PIPE_MEM_BANK_CUSTOM_RAW (8)
#define D_PIPE_MEM_BANK_MAX (8)
typedef enum {
E_MEM_BANK_SET = 0,
E_MEM_BANK_ING,
E_MEM_BANK_RCV,
E_MEM_BANK_MAX,
} E_BANK;
// 以下宏就是对E_BANK类型赋值
#define BANK_SET_TO_ING_AND_INCREMENT(a, b, mem, lock) a[E_MEM_BANK_ING] = a[E_MEM_BANK_SET];\
a[E_MEM_BANK_SET] = ( a[E_MEM_BANK_SET] + 1) % b;\
if( mem[ a[E_MEM_BANK_SET] ] == lock ){\
a[E_MEM_BANK_SET] = ( a[E_MEM_BANK_SET] + 1) % b;\
}
#define BANK_ING_TO_RCV(a) a[E_MEM_BANK_RCV] = a[E_MEM_BANK_ING]
#define BANK_SET_TO_ING_AND_INCREMENT_SPEC(a, b, mem) a[E_MEM_BANK_ING] = a[E_MEM_BANK_SET];\
a[E_MEM_BANK_SET] = ( a[E_MEM_BANK_SET] + 1) % b;\
int i=b; \
while(i--) { \
if( mem[ a[E_MEM_BANK_SET] ].lock == 1 ){\
printf("index %d, mem %#x, lock %d, addr %#x\n", a[E_MEM_BANK_SET], &mem[ a[E_MEM_BANK_SET] ], mem[ a[E_MEM_BANK_SET] ].lock, mem[ a[E_MEM_BANK_SET] ].addr); \
a[E_MEM_BANK_SET] = ( a[E_MEM_BANK_SET] + 1) % b;\
} else { \
break; \
} \
}
typedef struct {
ULONG mem_addr_raw[D_PIPE_MEM_BANK_RAW];
ULONG mem_addr_raw1[D_PIPE_MEM_BANK_RAW];
ULONG mem_addr_y[D_PIPE_MEM_BANK_Y];
ULONG mem_addr_c[D_PIPE_MEM_BANK_C];
ULONG mem_addr_y_ch1[D_PIPE_MEM_BANK_Y];
ULONG mem_addr_c_ch1[D_PIPE_MEM_BANK_C];
ULONG mem_addr_aeawb[D_PIPE_MEM_BANK_AEAWB];
ULONG mem_addr_map_yp[D_PIPE_MEM_BANK_MAP];
ULONG mem_addr_map_yn[D_PIPE_MEM_BANK_MAP];
ULONG mem_addr_map_rgb[D_PIPE_MEM_BANK_MAP_RGB];
UCHAR mem_bank_raw[E_MEM_BANK_MAX];
UCHAR mem_bank_raw1[E_MEM_BANK_MAX];
UCHAR mem_bank_y[E_MEM_BANK_MAX];
UCHAR mem_bank_c[E_MEM_BANK_MAX];
UCHAR mem_bank_y_ch1[E_MEM_BANK_MAX];
UCHAR mem_bank_c_ch1[E_MEM_BANK_MAX];
UCHAR mem_bank_aeawb[E_MEM_BANK_MAX];
UCHAR mem_bank_map[E_MEM_BANK_MAX];
UCHAR mem_bank_map_rgb[E_MEM_BANK_MAX];
UCHAR mem_bank_raw_num;
UCHAR mem_bank_yc_num;
UCHAR mem_bank_yc_ch1_num;
UCHAR mem_bank_map_num;
UCHAR mem_bank_map_rgb_num;
ULONG addr_custom_raw_ch; //last addr
UCHAR mem_bank_custom_raw_ch[E_MEM_BANK_MAX]; //mem addr index
UCHAR mem_bank_custom_raw_num;
ULONG mem_addr_custom_addr_c;
} T_SENSOR2YUV_MNG;
static T_SENSOR2YUV_MNG g_s2y_mng;
int main(int argc, char *argv[])
{
int temp = -1;
printf("%d\n", g_s2y_mng.mem_bank_y[E_MEM_BANK_SET]); // 0
printf("%d\n", g_s2y_mng.mem_bank_y[E_MEM_BANK_ING]); // 0
printf("%d\n", g_s2y_mng.mem_bank_y[E_MEM_BANK_RCV]); // 0
printf("%d\n", BANK_ING_TO_RCV(g_s2y_mng.mem_bank_y)); // 0
g_s2y_mng.mem_addr_y[0] = 0xaaaaaaaa;
g_s2y_mng.mem_addr_y[1] = 0xbbbbbbbb;
g_s2y_mng.mem_addr_y[2] = 0xcccccccc;
g_s2y_mng.mem_addr_y[3] = 0xdddddddd;
temp = g_s2y_mng.mem_addr_y[g_s2y_mng.mem_bank_y[E_MEM_BANK_RCV]];
printf("%#x\n", temp); // 0xaaaaaaaa
return 0;
}