sdsoc trace
_sds/
iprepo: 生成ip的repository
p0: 系統生成
reports: 報告
swstubs: sw codes
vhls: run hls
_sds/p0:
p0/sd_card:
boot.bif 內容:
boot sequence:
_sds/reports:
sds_xxx.jou: sds++ compile 過程:生成arraycopy.o
sds.jou: compile xxx.o , create block diagram, # Rewrite caller functions, # Compile caller rewrite file, # Create accelerator stub functions,
# Compile hardware access API functions
arm-linux-gnueabihf-gcc -I /home/roy/sdsoc/SDx/2019.1/target/aarch32-linux/include -D HLS_NO_XIL_FPO_LIB -I /home/roy/sdsoc/Vivado/2019.1/include -c /home/roy/workspace/array_copy/Debug/_sds/swstubs/portinfo.c
arm-linux-gnueabihf-g++ -I /home/roy/sdsoc/SDx/2019.1/target/aarch32-linux/include -D HLS_NO_XIL_FPO_LIB -I /home/roy/sdsoc/Vivado/2019.1/include -c /home/roy/workspace/array_copy/Debug/_sds/swstubs/cf_stub.c
arm-linux-gnueabihf-ar crs /home/roy/workspace/array_copy/Debug/_sds/swstubs/libxlnk_stub.a /home/roy/workspace/array_copy/Debug/_sds/swstubs/portinfo.o /home/roy/workspace/array_copy/Debug/_sds/swstubs/cf_stub.o
cd /home/roy/workspace/array_copy/Debug
cd /home/roy/workspace/array_copy/Debug/_sds/swstubs
# Compile accelerator stub functions
arm-linux-gnueabihf-g++ -c arraycopy.cpp -I/home/roy/workspace/array_copy/src -I/home/roy/workspace/array_copy/src -Wall -O0 -g -fmessage-length=0 -MMD -MP -D __SDSCC__ -I /home/roy/sdsoc/SDx/2019.1/target/aarch32-linux/include -D HLS_NO_XIL_FPO_LIB -I /home/roy/sdsoc/Vivado/2019.1/include -o arraycopy.o
arm-linux-gnueabihf-g++ -c arraycopy.cpp -I/home/roy/workspace/array_copy/src -I/home/roy/workspace/array_copy/src -Wall -O0 -g -fmessage-length=0 -MMD -MP -D __SDSCC__ -I /home/roy/sdsoc/SDx/2019.1/target/aarch32-linux/include -D HLS_NO_XIL_FPO_LIB -I /home/roy/sdsoc/Vivado/2019.1/include -o arraycopy.o
cd /home/roy/workspace/array_copy/Debug
cd /home/roy/workspace/array_copy/Debug/_sds/swstubs
arm-linux-gnueabihf-ar crs /home/roy/workspace/array_copy/Debug/_sds/swstubs/libarray_copy.a /home/roy/workspace/array_copy/Debug/_sds/swstubs/portinfo.o /home/roy/workspace/array_copy/Debug/_sds/swstubs/cf_stub.o /home/roy/workspace/array_copy/Debug/_sds/swstubs/arraycopy.o
cd /home/roy/workspace/array_copy/Debug
# Preliminary link application ELF
arm-linux-gnueabihf-g++ /home/roy/workspace/array_copy/Debug/_sds/swstubs/arraycopy.o -L/home/roy/workspace/array_copy/Debug/_sds/swstubs -Wl, — start-group -Wl, — end-group -Wl, — start-group -lpthread -L/home/roy/sdsoc/SDx/2019.1/target/aarch32-linux/lib -lsds_lib -lxlnk_stub -Wl, — end-group -o /home/roy/workspace/array_copy/Debug/_sds/swstubs/array_copy.elf
arm-linux-gnueabihf-objcopy -R .xdinfo -R .xddata -R .xdasm -R .xdfcnmap -R .xdhlscore -R .xdif -R .xdparams -R .xdcore -R .xdrepo -R .xdsdata -R .xdpp -R .xdrtlx /home/roy/workspace/array_copy/Debug/_sds/swstubs/array_copy.elf
cd /home/roy/workspace/array_copy/Debug
# Enable generation of hardware programming files
# Enable generation of boot files
# Calling VPL
# Compile hardware access API functions
arm-linux-gnueabihf-gcc -I /home/roy/sdsoc/SDx/2019.1/target/aarch32-linux/include -D HLS_NO_XIL_FPO_LIB -I /home/roy/sdsoc/Vivado/2019.1/include -c /home/roy/workspace/array_copy/Debug/_sds/swstubs/portinfo.c
arm-linux-gnueabihf-g++ -I /home/roy/sdsoc/SDx/2019.1/target/aarch32-linux/include -D HLS_NO_XIL_FPO_LIB -I /home/roy/sdsoc/Vivado/2019.1/include -c /home/roy/workspace/array_copy/Debug/_sds/swstubs/cf_stub.c
arm-linux-gnueabihf-ar crs /home/roy/workspace/array_copy/Debug/_sds/swstubs/libxlnk_stub.a /home/roy/workspace/array_copy/Debug/_sds/swstubs/portinfo.o /home/roy/workspace/array_copy/Debug/_sds/swstubs/cf_stub.o
cd /home/roy/workspace/array_copy/Debug
cd /home/roy/workspace/array_copy/Debug/_sds/swstubs
arm-linux-gnueabihf-ar crs /home/roy/workspace/array_copy/Debug/_sds/swstubs/libarray_copy.a /home/roy/workspace/array_copy/Debug/_sds/swstubs/portinfo.o /home/roy/workspace/array_copy/Debug/_sds/swstubs/cf_stub.o /home/roy/workspace/array_copy/Debug/_sds/swstubs/arraycopy.o
cd /home/roy/workspace/array_copy/Debug
# Link application ELF file
arm-linux-gnueabihf-g++ /home/roy/workspace/array_copy/Debug/_sds/swstubs/arraycopy.o -L/home/roy/workspace/array_copy/Debug/_sds/swstubs -Wl, — start-group -Wl, — end-group -Wl, — start-group -lpthread -L/home/roy/sdsoc/SDx/2019.1/target/aarch32-linux/lib -lsds_lib -lxlnk_stub -Wl, — end-group -o /home/roy/workspace/array_copy/Debug/_sds/swstubs/array_copy.elf
arm-linux-gnueabihf-objcopy -R .xdinfo -R .xddata -R .xdasm -R .xdfcnmap -R .xdhlscore -R .xdif -R .xdparams -R .xdcore -R .xdrepo -R .xdsdata -R .xdpp -R .xdrtlx /home/roy/workspace/array_copy/Debug/_sds/swstubs/array_copy.elf
sds/swstubs: array_copy.elf 組成:
arraycopy.o + libxlnk_stub.a + libsds_lib.so
// libxlnk_stub.a: portinfo.c, cf_stub.c
codes trace:
void p_0_cf_framework_open(void) __attribute__((constructor));// 呼main之前會先執行
void p_0_cf_framework_close(void) __attribute__((destructor));
void p_0_cf_framework_open(void)// portinfo.c
{
if (xlnkOpen()) {
cf_context_init();
xlnkCounterMap(666666687);
pfm_hook_init();
sds_trace_setup(0x0);
}
p_0_init_pl();
}{
sysport_open(&_sds_sysportp_0_ps7_S_AXI_ACP);
fast_dma_open(&p_0_dm_1); //dma struct
fast_dma_open(&p_0_dm_2);
fast_dma_open(&p_0_dm_3);
fast_dma_open(&p_0_dm_4);
axi_lite_open(&p_0_hwinst_arraycopy_1_cmd_arraycopy_info); //axi info
axi_lite_open(&p_0_hwinst_arraycopy_1_ap_return_info);
axi_lite_open(&p_0_hwinst_arraycopy2_1_cmd_arraycopy2_info);
axi_lite_open(&p_0_hwinst_arraycopy2_1_ap_return_info);
_sds_p_0_arraycopy_1.arg_dm_id[0] = p_0_hwinst_arraycopy_1_cmd_arraycopy_info.dm_id;
_sds_p_0_arraycopy_1.arg_dm_id[1] = p_0_dm_2.dm_id;
_sds_p_0_arraycopy_1.arg_dm_id[2] = p_0_dm_4.dm_id;
_sds_p_0_arraycopy_1.arg_dm_id[3] = p_0_hwinst_arraycopy_1_ap_return_info.dm_id;
_sds_p_0_arraycopy_1.arg_dm_id_count = 4;
accel_open(&_sds_p_0_arraycopy_1); //ip info
_sds_p_0_arraycopy2_1.arg_dm_id[0] = p_0_hwinst_arraycopy2_1_cmd_arraycopy2_info.dm_id;
_sds_p_0_arraycopy2_1.arg_dm_id[1] = p_0_dm_1.dm_id;
_sds_p_0_arraycopy2_1.arg_dm_id[2] = p_0_dm_3.dm_id;
_sds_p_0_arraycopy2_1.arg_dm_id[3] = p_0_hwinst_arraycopy2_1_ap_return_info.dm_id;
_sds_p_0_arraycopy2_1.arg_dm_id_count = 4;
accel_open(&_sds_p_0_arraycopy2_1);
}
int main(int argc, char* argv[])
{
data_t Bs[N];
data_t *A = (data_t*)sds_alloc(N * sizeof(data_t));
data_t *B = (data_t*)sds_alloc(N * sizeof(data_t));
data_t *C = (data_t*)sds_alloc(N * sizeof(data_t));
int result;
for (int i = 1; i < 16; i++) {
for (int j = 1; j < N; j++) {
A[j] = i;
B[j] = 0;
C[j] = 0;
Bs[j] = 0;
}
arraycopy_sw(A, Bs);
p_0_arraycopy_1_noasync(A, B);
print_results(A, Bs, B);
result = compare(Bs, B);
p_0_arraycopy2_1_noasync(A, C);
print_results(A, Bs, C);
result = compare(Bs, C);
}
return result;
}
int p_0_arraycopy_1_noasync(data_t * a, data_t b[16])
{
int start_seq[2];
start_seq[0] = 16 * 2;
start_seq[1] = 0;
cf_request_handle_t p_0_hwinst_arraycopy_1_cmd;
cf_send_i(&(p_0_hwinst_arraycopy_1.cmd_arraycopy), start_seq, 2 * sizeof(int), &p_0_hwinst_arraycopy_1_cmd);// set register
cf_wait(p_0_hwinst_arraycopy_1_cmd);
cf_send_i(&(p_0_hwinst_arraycopy_1.a), a, 32, &p_0_request_0);// 啟動send dma
int p_0_arraycopy_1_noasync_v_return;
cf_receive_i(&(p_0_hwinst_arraycopy_1.b_PORTA), b, 32, &p_0_arraycopy_1_noasync_num_b_PORTA, &p_0_request_1);
cf_receive_i(&(p_0_hwinst_arraycopy_1.ap_return), &p_0_arraycopy_1_noasync_v_return, 4, &p_0_arraycopy_1_noasync_num_ap_return, &p_0_request_2);//啟動receive dma
cf_wait(p_0_request_1);
cf_wait(p_0_request_2);
return p_0_arraycopy_1_noasync_v_return;
}
// include path: sdsoc/SDx/2019.1/target/aarch-32-linux/include
nm -C/D libsds_lib.so:
objdump -t libsds_lib.so:
xilinx APF accelerator driver:
參考:
- https://www.mscto.com/op/392421.html
- Xilinx SDSoC (2016.3版)
解体新書
ソフトウェア編
@Vengineer
SDSoC勉強会 (2017/1/28) - https://blog.csdn.net/shenwansan_gz/article/details/47155127
- https://medium.com/fcamels-notes/linux-%E5%9F%B7%E8%A1%8C%E6%99%82%E5%B0%8B%E6%89%BE-symbol-%E7%9A%84%E6%B5%81%E7%A8%8B%E4%BB%A5%E5%8F%8A-shared-library-%E7%9B%B8%E9%97%9C%E7%9F%A5%E8%AD%98-b0cf1e19cbf3