CODEC
简要说明
codec是音频编解码器,其具有音频采集(将模拟量转换为数字量)和音频播放功能(数字音频转换为模拟量),同时可以进行数据滤波、增益等。
接口描述
csi_codec_init
int32_t csi_codec_init(uint32_t idx);
- 功能描述:
- 通过设备号初始化对应的codec实例,获取codec资源。
- 参数:
- 返回值:
csi_codec_uninit
void csi_codec_uninit(uint32_t idx);
csi_codec_power_control
int32_t csi_codec_power_control(int32_t idx, csi_power_stat_e state);
- 功能描述:
- 参数:
idx
: 设备号。
state
: 功率模式,见csi_power_stat_e定义。
- 返回值:
csi_power_stat_e:
名字 |
定义 |
备注 |
DRV_POWER_OFF |
关电源状态 |
|
DRV_POWER_LOW |
低电平状态 |
|
DRV_POWER_FULL |
全电源状态 |
|
DRV_POWER_SUSPEND |
挂起电源状态 |
int32_t csi_codec_input_open(codec_input_t *handle);
- 功能描述:
- 参数:
handle
: ocdec input句柄,用于配置与控制input通路,在通路开启时,为通路分配资源。见codec_input_t定义。
- 返回值:
int32_t csi_codec_input_close(codec_input_t *handle);
- 功能描述:
- 参数:
handle
: ocdec input句柄,用于配置与控制input通路,见codec_input_t定义。
- 返回值:
名称 |
定义 |
备注 |
codec_idx |
codec设备号 |
|
ch_idx |
input 通道号码 |
|
cb |
事件回调函数 |
|
cb_arg |
事件回调函数用户参数 |
|
buf |
input 数据缓存区 |
|
buf_size |
input 数据缓存区大小 |
|
period |
每采集period bytes数据量,触发一次回调函数 |
|
priv |
保留(用于接口桥接) |
codec_event_cb_t:
typedef void (*codec_event_cb_t)(codec_event_t event, void *arg);
功能描述:
参数:
event
: codec事件,见 codec_event_t定义。
arg
: 用户注册回调参数,当回调函数触发时,会传入用户定义的的参数。
返回值:
codec_event_t
名称 |
定义 |
备注 |
CODEC_EVENT_PERIOD_READ_COMPLETE |
codec输入通路,获取完毕period bytes数据 |
|
CODEC_EVENT_PERIOD_WRITE_COMPLETE |
codec输出通路,发送完毕period bytes数据 |
|
CODEC_EVENT_WRITE_BUFFER_EMPTY |
codec输出通路,数据缓存区已空(缓存区为空,codec将输出0数据) |
|
CODEC_EVENT_READ_BUFFER_FULL |
codec输入通路,数据缓存区已满(缓存区满,录音数据将无法写入缓存,数据丢失) |
|
CODEC_EVENT_TRANSFER_ERROR |
codec运行异常。 |
int32_t csi_codec_input_config(codec_input_t *handle, codec_input_config_t *config);
- 功能描述:
- codec 输入通路初始化,需要在codec input 通路启动前调用,运行过程中不可配置。
- 参数:
handle
: ocdec input句柄,见codec_input_t定义。
config
: codec 输入通路配置参数,见 codec_input_config_t定义。
- 返回值:
名称 |
定义 |
备注 |
sample_rate |
采样率 |
见codec_sample_rate_t定义 |
channel_num |
通路的通道个数 |
例如:录制双声道(左右声道数据交叉存储)音频,channel_num设置为2 |
bit_width |
采样精度 |
codec_sample_rate_e:
名称 |
定义 |
备注 |
CODEC_SAMPLE_RATE_8000 |
采样率:8000 |
|
CODEC_SAMPLE_RATE_11025 |
采样率:11025 |
|
CODEC_SAMPLE_RATE_12000 |
采样率:12000 |
|
CODEC_SAMPLE_RATE_16000 |
采样率:16000 |
|
CODEC_SAMPLE_RATE_22050 |
采样率:22050 |
|
CODEC_SAMPLE_RATE_24000 |
采样率:24000 |
|
CODEC_SAMPLE_RATE_32000 |
采样率:32000 |
|
CODEC_SAMPLE_RATE_44100 |
采样率:44100 |
|
CODEC_SAMPLE_RATE_48000 |
采样率:48000 |
|
CODEC_SAMPLE_RATE_96000 |
采样率:96000 |
|
CODEC_SAMPLE_RATE_192000 |
采样率:192000 |
uint32_t csi_codec_input_read(codec_input_t *handle, uint8_t *buf, uint32_t length);
- 功能描述:
- 参数:
handle
: ocdec input句柄,见codec_input_t定义。
buf
: 读出数据的存储区。
length
: 读取数据长度,单位bytes。
- 返回值:
- 实际读取数据长度(单位bytes),例如:length=1000,缓存区内数据为100,则实际读取数据为100,返回值为100。
uint32_t csi_codec_input_buf_avail(codec_input_t *handle);
- 功能描述:
- 获取codec input通路缓存区空闲区域大小。
- 参数:
handle
: ocdec input句柄,见codec_input_t定义。
- 返回值:
- codec input通路缓存区空闲空间,单位bytes。
int32_t csi_codec_input_buf_reset(codec_input_t *handle);
- 功能描述:
- 复位codec input通路缓存区,复位后,缓存区的数据全部清空。
- 参数:
handle
: ocdec input句柄,见codec_input_t定义。
- 返回值:
int32_t csi_codec_input_start(codec_input_t *handle);
- 功能描述:
- 启动codec input 通路,启动后,codec input开始采集数据。
- 参数:
handle
: ocdec input句柄,见codec_input_t定义。
- 返回值:
int32_t csi_codec_input_stop(codec_input_t *handle);
- 功能描述:
- 停止codec input 通路数据采集,调用stop后,当前缓存区内的数据全部被清空。若想停止采集并且数不被清空,可调用csi_codec_input_pause函数,见csi_codec_input_pause定义。
- 参数:
handle
: ocdec input句柄,见codec_input_t定义。
- 返回值:
int32_t csi_codec_input_pause(codec_input_t *handle);
- 功能描述:
- 暂停codec input 通路,codec input通路暂停后,数据停止采集,缓存区内数据不丢失,调用csi_codec_input_resume恢复采集后,数据续接。
- 参数:
handle
: ocdec input句柄,见codec_input_t定义。
- 返回值:
int32_t csi_codec_input_resume(codec_input_t *handle);
- 功能描述:
- 从暂停状态恢复codec input通路的数据采集。
- 参数:
handle
: ocdec input句柄,见codec_input_t定义。
- 返回值:
int32_t csi_codec_input_set_digital_gain(codec_input_t *handle, int32_t val);
- 功能描述:
- 参数:
handle
: ocdec input句柄,见codec_input_t定义。
val
: 增益数值
- 返回值:
int32_t csi_codec_input_set_analog_gain(codec_input_t *handle, int32_t val);
- 功能描述:
- 参数:
handle
: ocdec input句柄,见codec_input_t定义。
val
: 增益数值
- 返回值:
int32_t csi_codec_input_get_digital_gain(codec_input_t *handle, int32_t *val);
- 功能描述:
- 参数:
handle
: ocdec input句柄,见codec_input_t定义。
val
: 存储增益数值
- 返回值:
int32_t csi_codec_input_get_analog_gain(codec_input_t *handle, int32_t *val);
- 功能描述:
- 参数:
handle
: ocdec input句柄,见codec_input_t定义。
val
: 存储增益数值
- 返回值:
int32_t csi_codec_input_set_mixer_gain(codec_input_t *handle, int32_t val);
- 功能描述:
- 参数:
handle
: ocdec input句柄,见codec_input_t定义。
val
: 增益数值
- 返回值:
int32_t csi_codec_input_get_mixer_gain(codec_input_t *handle, int32_t *val);
- 功能描述:
- 参数:
handle
: ocdec input句柄,见codec_input_t定义。
val
: 存储增益数值
- 返回值:
int32_t csi_codec_input_mute(codec_input_t *handle, int en);
- 功能描述:
- 控制codec input通路静音,当使能静音时,input通路采集的数据无声音。
- 参数:
handle
: ocdec input句柄,见codec_input_t定义。
en
: 1:使能,0关闭。
- 返回值:
csi_codec_output_open
int32_t csi_codec_output_open(codec_output_t *handle);
- 功能描述:
- 参数:
handle
: codec_output_t句柄,用于配置与控制output通路,在通路开启时,为通路分配资源。见codec_output_t定义。
- 返回值:
csi_codec_output_close
int32_t csi_codec_output_close(codec_output_t *handle);
- 功能描述:
- 参数:
handle
: codec_output_t句柄。
- 返回值:
codec_output_t:
名称 |
定义 |
备注 |
codec_idx |
codec设备号 |
|
ch_idx |
input 通道号码 |
|
cb |
事件回调函数 |
|
cb_arg |
事件回调函数用户参数 |
|
buf |
input 数据缓存区 |
|
buf_size |
input 数据缓存区大小 |
|
period |
每采集period bytes数据量,触发一次回调函数 |
|
priv |
保留(用于接口桥接) |
csi_codec_output_config
int32_t csi_codec_output_config(codec_output_t *handle, codec_output_config_t *config);
- 功能描述:
- codec 输除通路初始化,需要在codec output通路启动前调用,运行过程中不可配置。
- 参数:
handle
: codec_output_t句柄,见codec_input_t定义。
config
: codec 输出通路配置参数,见 codec_output_config_t定义。
- 返回值:
codec_output_config_t:
名称 |
定义 |
备注 |
sample_rate |
采样率 |
见codec_sample_rate_t定义 |
bit_width |
采样精度 |
|
mono_mode_en |
使能单声道模式 |
mono_mode_en=1:使能单声道模式, 0关闭单声道模式 |
codec_sample_rate_e:
名称 |
定义 |
备注 |
CODEC_SAMPLE_RATE_8000 |
采样率:8000 |
|
CODEC_SAMPLE_RATE_11025 |
采样率:11025 |
|
CODEC_SAMPLE_RATE_12000 |
采样率:12000 |
|
CODEC_SAMPLE_RATE_16000 |
采样率:16000 |
|
CODEC_SAMPLE_RATE_22050 |
采样率:22050 |
|
CODEC_SAMPLE_RATE_24000 |
采样率:24000 |
|
CODEC_SAMPLE_RATE_32000 |
采样率:32000 |
|
CODEC_SAMPLE_RATE_44100 |
采样率:44100 |
|
CODEC_SAMPLE_RATE_48000 |
采样率:48000 |
|
CODEC_SAMPLE_RATE_96000 |
采样率:96000 |
|
CODEC_SAMPLE_RATE_192000 |
采样率:192000 |
csi_codec_output_write
uint32_t csi_codec_output_write(codec_output_t *handle, uint8_t *buf, uint32_t length);
- 功能描述:
- 参数:
handle
: ocdec output句柄,见codec_input_t定义。
buf
: 写入数据。
length
: 写入数据长度,单位bytes。
- 返回值:
- 实际写入数据长度(单位bytes),例如:length=1000bytes,缓存区空余100bytes,则实际写入数据为100bytes,返回值为100。
csi_codec_output_buf_avail
uint32_t csi_codec_output_buf_avail(codec_output_t *handle);
- 功能描述:
- 获取codec output通路缓存区空闲区域大小。
- 参数:
handle
: ocdec output句柄,见codec_output_t定义。
- 返回值:
- codec output通路缓存区空闲空间,单位bytes。
csi_codec_output_buf_reset
int32_t csi_codec_output_buf_reset(codec_output_t *handle);
- 功能描述:
- 复位codec input通路缓存区,复位后,缓存区的数据全部清空。
- 参数:
handle
: ocdec output句柄,见codec_output_t定义。
- 返回值:
csi_codec_output_start
int32_t csi_codec_output_start(codec_output_t *handle);
- 功能描述:
- 启动codec output通路,启动后,codec output开始采集数据。
- 参数:
handle
: ocdec output句柄,见codec_output_t定义。
- 返回值:
csi_codec_output_stop
int32_t csi_codec_output_stop(codec_output_t *handle);
- 功能描述:
- 停止codec output通路数据输出,调用stop后,当前缓存区内的数据全部被清空。若想停止输出并且数不被清空,可调用csi_codec_output_pause函数,见csi_codec_output_pause定义。
- 参数:
handle
: ocdec output句柄,见codec_output_t定义。
- 返回值:
csi_codec_output_pause
int32_t csi_codec_output_pause(codec_output_t *handle);
- 功能描述:
- 暂停codec output通路,codec output通路暂停后,停止播放数据,缓存区内数据不丢失,调用csi_codec_output_resume恢复播放,数据续接。
- 参数:
handle
: ocdec output句柄,见codec_output_t定义。
- 返回值:
csi_codec_output_resume
int32_t csi_codec_output_resume(codec_output_t *handle);
- 功能描述:
- 从暂停状态恢复codec output通路的数据输出。
- 参数:
handle
: ocdec output句柄,见codec_output_t定义。
- 返回值:
csi_codec_output_set_digital_left_gain
int32_t csi_codec_output_set_digital_left_gain(codec_output_t *handle, int32_t val);
- 功能描述:
- 设置codec output通路的左声道数字增益。
- 参数:
handle
: ocdec output句柄,见codec_output_t定义。
val
: 增益数值
- 返回值:
csi_codec_output_set_digital_right_gain
int32_t csi_codec_output_set_digital_right_gain(codec_output_t *handle, int32_t val);
- 功能描述:
- 设置codec output通路的右声道数字增益。
- 参数:
handle
: ocdec output句柄,见codec_output_t定义。
val
: 增益数值
- 返回值:
csi_codec_output_set_analog_left_gain
int32_t csi_codec_output_set_analog_left_gain(codec_output_t *handle, int32_t val);
- 功能描述:
- 参数:
handle
: ocdec output句柄,见codec_output_t定义。
val
: 增益数值
- 返回值:
csi_codec_output_set_analog_right_gain
int32_t csi_codec_output_set_analog_right_gain(codec_output_t *handle, int32_t val);
- 功能描述:
- 参数:
handle
: ocdec output句柄,见codec_output_t定义。
val
: 增益数值
- 返回值:
csi_codec_output_get_digital_left_gain
int32_t csi_codec_output_get_digital_left_gain(codec_output_t *handle, int32_t *val);
- 功能描述:
- 获取当前codec output通路左声道数字增益值。
- 参数:
handle
: ocdec output句柄,见codec_output_t定义。
val
: 存储增益数值
- 返回值:
csi_codec_output_get_digital_right_gain
int32_t csi_codec_output_get_digital_right_gain(codec_output_t *handle, int32_t *val);
- 功能描述:
- 获取当前codec output通路右声道数字增益值。
- 参数:
handle
: ocdec output句柄,见codec_output_t定义。
val
: 存储增益数值
- 返回值:
csi_codec_output_get_analog_left_gain
int32_t csi_codec_output_get_analog_left_gain(codec_output_t *handle, int32_t *val);
- 功能描述:
- 获取codec output通路当前左声道模拟增益。
- 参数:
handle
: ocdec output句柄,见codec_output_t定义。
val
: 存储增益数值
- 返回值:
csi_codec_output_get_analog_right_gain
int32_t csi_codec_output_get_analog_right_gain(codec_output_t *handle, int32_t *val);
- 功能描述:
- 获取codec output通路当前右声道模拟增益。
- 参数:
handle
: ocdec output句柄,见codec_output_t定义。
val
: 存储增益数值
- 返回值:
csi_codec_output_set_mixer_left_gain
int32_t csi_codec_output_set_mixer_left_gain(codec_output_t *handle, int32_t val);
- 功能描述:
- 设置codec output通路混频器左声道增益。
- 参数:
handle
: ocdec output句柄,见codec_output_t定义。
val
: 增益数值
- 返回值:
csi_codec_output_set_mixer_right_gain
int32_t csi_codec_output_set_mixer_right_gain(codec_output_t *handle, int32_t val);
- 功能描述:
- 设置codec output通路混频器右声道增益。
- 参数:
handle
: ocdec output句柄,见codec_output_t定义。
val
: 增益数值
- 返回值:
csi_codec_output_get_mixer_left_gain
int32_t csi_codec_output_get_mixer_left_gain(codec_output_t *handle, int32_t *val);
- 功能描述:
- 获取codec output通路当前混频器左声道增益。
- 参数:
handle
: ocdec output句柄,见codec_output_t定义。
val
: 存储增益数值
- 返回值:
csi_codec_output_get_mixer_right_gain
int32_t csi_codec_output_get_mixer_right_gain(codec_output_t *handle, int32_t *val);
- 功能描述:
- 获取codec output通路当前混频器右声道增益。
- 参数:
handle
: ocdec output句柄,见codec_output_t定义。
val
: 存储增益数值
- 返回值:
csi_codec_output_mute
int32_t csi_codec_output_mute(codec_output_t *handle, int en);
- 功能描述:
- 控制codec output通路静音,当使能静音时,output通路播放无声音输出。
- 参数:
handle
: ocdec output句柄,见codec_output_t定义。
en
: 1:使能,0关闭。
- 返回值:
示例:
#include <stdint.h>
#include <stdio.h>
#include <csi_kernel.h>
#include "pinmux.h"
#include "drv_gpio.h"
#include "pin.h"
#include "drv_codec.h"
static void speaker_init()
{
drv_pinmux_config(EXAMPLE_CODEC_PA_CTRL_PIN, EXAMPLE_CODEC_PA_CTRL_PIN_FUNC);
gpio_pin_handle_t pgpio_pin_handle = csi_gpio_pin_initialize(PB22, NULL);
csi_gpio_pin_config_mode(pgpio_pin_handle, GPIO_MODE_PULLNONE);
csi_gpio_pin_config_direction(pgpio_pin_handle, GPIO_DIRECTION_OUTPUT);
csi_gpio_pin_write(pgpio_pin_handle, true);
}
static k_sem_handle_t player_sem;
static void player_cb(codec_event_t event, void *arg)
{
if (event == CODEC_EVENT_WRITE_BUFFER_EMPTY) {
printf("empty\n");
}
csi_kernel_sem_post(player_sem);
}
#define PLAYER_BUF_SIZE (1024 * 10)
static uint8_t player_buf[PLAYER_BUF_SIZE];
static codec_output_t output_handle;
static int player_init()
{
player_sem = csi_kernel_sem_new(1, 0);
if (player_sem == NULL) {
return -1;
}
output_handle.buf = player_buf;
output_handle.buf_size = PLAYER_BUF_SIZE;
output_handle.cb = player_cb;
output_handle.cb_arg = NULL;
output_handle.ch_idx = 0;
output_handle.codec_idx = 0;
output_handle.period = 4096;
int ret = csi_codec_output_open(&output_handle);
if (ret != 0) {
printf("codec output open error\n");
return -1;
}
codec_output_config_t config;
config.bit_width = 16;
config.mono_mode_en = 0;
config.sample_rate = 48000;
ret = csi_codec_output_config(&output_handle, &config);
if (ret != 0) {
printf("output config error\n");
return -1;
}
csi_codec_output_set_mixer_left_gain(&output_handle, -20);
csi_codec_output_set_mixer_right_gain(&output_handle, -20);
return 0;
}
extern unsigned char voice_file[];
extern uint32_t voice_len;
static void play_sound()
{
int ret = -1;
csi_codec_output_start(&output_handle);
printf("output start\n");
while(1) {
uint32_t tx_data_len = 150*1024;
uint8_t *tx_data = voice_file;
uint32_t ret_len = 0;
while(tx_data_len) {
ret_len = csi_codec_output_write(&output_handle, (uint8_t *)tx_data, tx_data_len);
tx_data_len -= ret_len;
tx_data += ret_len;
csi_kernel_sem_wait(player_sem, -1);
}
}
printf("player end\n");
csi_codec_output_stop(&output_handle);
ret = csi_codec_output_close(&output_handle);
if (ret != 0) {
printf("2 codec output close error\n");
return;
}
}
void player_test()
{
if (player_init() == -1) {
printf("player init error\n");
return;
}
printf("player init end\n");
play_sound();
}
#define RECORD_BUF_SIZE (1024 * 100)
static uint8_t receive_buf[RECORD_BUF_SIZE];
static codec_input_t input_handle;
#define RX_BUF_SIZE (10 * 1024)
static uint8_t rx_buf[RX_BUF_SIZE];
static k_sem_handle_t record_sem;
static void record_cb(codec_event_t event, void *arg)
{
if (event == CODEC_EVENT_WRITE_BUFFER_EMPTY) {
printf("empty\n");
}
csi_kernel_sem_post(record_sem);
}
static int record_init()
{
record_sem = csi_kernel_sem_new(1, 0);
if (record_sem == NULL) {
return -1;
}
input_handle.buf = rx_buf;
input_handle.buf_size = RX_BUF_SIZE;
input_handle.cb = record_cb;
input_handle.cb_arg = NULL;
input_handle.ch_idx = 0;
input_handle.codec_idx = 0;
input_handle.period = 2560;
int ret = csi_codec_input_open(&input_handle);
if (ret != 0) {
printf("codec input open error\n");
return -1;
}
codec_input_config_t config;
config.bit_width = 16;
config.channel_num = 1;
config.sample_rate = 16000;
ret = csi_codec_input_config(&input_handle, &config);
if (ret != 0) {
printf("codec input config error\n");
return -1;
}
csi_codec_input_set_analog_gain(&input_handle, 4);
return 0;
}
void record_teset()
{
int ret = record_init();
if (ret != 0) {
printf("record init error\n");
return;
}
printf("record init end\n");
uint32_t rx_data_len = RECORD_BUF_SIZE;
uint8_t *rx_buf = (uint8_t *)receive_buf;
uint32_t ret_len = 0;
csi_codec_input_start(&input_handle);
while(rx_data_len) {
csi_kernel_sem_wait(record_sem, -1);
ret_len = csi_codec_input_read(&input_handle, rx_buf, rx_data_len);
rx_data_len -= ret_len;
rx_buf+= ret_len;
}
printf("record end\n");
}
static uint8_t receive_buf1[RECORD_BUF_SIZE];
static codec_input_t input_handle1;
static uint8_t rx_buf1[RX_BUF_SIZE];
static k_sem_handle_t record_ref_sem;
static void record_ref_cb(codec_event_t event, void *arg)
{
if (event == CODEC_EVENT_WRITE_BUFFER_EMPTY) {
printf("empty\n");
}
csi_kernel_sem_post(record_ref_sem);
}
static int record_ref_init()
{
record_ref_sem = csi_kernel_sem_new(1, 0);
if (record_ref_sem == NULL) {
return -1;
}
input_handle1.buf = rx_buf1;
input_handle1.buf_size = RX_BUF_SIZE;
input_handle1.cb = record_ref_cb;
input_handle1.cb_arg = NULL;
input_handle1.ch_idx = 2;
input_handle1.codec_idx = 0;
input_handle1.period = 2560;
int ret = csi_codec_input_open(&input_handle1);
if (ret != 0) {
printf("codec input open error\n");
return -1;
}
codec_input_config_t config;
config.bit_width = 16;
config.channel_num = 1;
config.sample_rate = 16000;
ret = csi_codec_input_config(&input_handle1, &config);
if (ret != 0) {
printf("codec input config error\n");
return -1;
}
csi_codec_input_set_analog_gain(&input_handle1, 4);
return 0;
}
void record_ref_teset()
{
int ret = record_ref_init();
if (ret != 0) {
printf("record ref init error\n");
return;
}
printf("record ref init end\n");
uint32_t rx_data_len = RECORD_BUF_SIZE;
uint8_t *rx_buf = (uint8_t *)receive_buf1;
uint32_t ret_len = 0;
csi_codec_input_start(&input_handle1);
while(rx_data_len) {
csi_kernel_sem_wait(record_ref_sem, -1);
ret_len = csi_codec_input_read(&input_handle1, rx_buf, rx_data_len);
rx_data_len -= ret_len;
rx_buf+= ret_len;
}
printf("record ref end\n");
}
#define EXAMPLE_PRIO 5
#define EXAMPLE_TASK_STK_SIZE 1024
k_task_handle_t player_task;
k_task_handle_t record_task;
k_task_handle_t ref_record_task;
void player(void)
{
player_test();
}
void record()
{
record_teset();
}
void ref_record()
{
record_ref_teset();
}
int main(void)
{
csi_kernel_init();
speaker_init();
int32_t ret = csi_codec_init(0);
if (ret != 0) {
printf("codec init error\n");
}
printf("codec init end\n");
csi_kernel_task_new((k_task_entry_t)player, "player",
0, EXAMPLE_PRIO, 0, 0, EXAMPLE_TASK_STK_SIZE, &player_task);
csi_kernel_task_new((k_task_entry_t)record, "record",
0, EXAMPLE_PRIO, 0, 0, EXAMPLE_TASK_STK_SIZE, &record_task);
csi_kernel_task_new((k_task_entry_t)ref_record, "ref_record",
0, EXAMPLE_PRIO, 0, 0, EXAMPLE_TASK_STK_SIZE, &ref_record_task);
csi_kernel_start();
return 0;
}