注意加锁保护,防止两个线程同时读写造成数据不正确
int8_t mfcc[MFCC_LEN][MFCC_COEFFS];//线程A使用的
int8_t mfcc_buf[MFCC_LEN][MFCC_COEFFS];//共享buf
int8_t mfcc_seq[MFCC_LEN][MFCC_COEFFS];//线程B使用的
#define MFCC_FEAT_SIZE (MFCC_LEN * MFCC_COEFFS)
uint32_t index = 0;
void thread_A()
{
…………………………
while(1)
{
fun(mfcc[index]);//将处理后的结果MFCC_COEFFS个数据保存到mfcc二维数组第index行
uint32_t lock = int_lock();
memcpy(mfcc_buf[index], mfcc[index], MFCC_COEFFS);
index++;//到mfcc二维数组下一行
if (index >= MFCC_LEN)
{
index = 0;//buf填满后从头开始填并覆盖原数据
}
int_unlock(lock);
}
……………………
}
void thread_B()
{
………………………………
while(1)
{
uint32_t lock = int_lock();
// mfcc_buf: new data|old data ---> mfcc_seq: old data|new data
uint32_t len_first = (MFCC_FEAT_SIZE - index * MFCC_COEFFS);
uint32_t len_second = index * MFCC_COEFFS;
memcpy(&mfcc_seq[0][0], &mfcc_buf[0][0] + len_second, len_first);
memcpy(&mfcc_seq[0][0] + len_first, &mfcc_buf[0][0], len_second);
int_unlock(lock);
}
……………………………………
}