160 lines
5.3 KiB
C
160 lines
5.3 KiB
C
/*
|
|
* Copyright (c) 2020 AIIT XUOS Lab
|
|
* XiUOS is licensed under Mulan PSL v2.
|
|
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
|
* You may obtain a copy of Mulan PSL v2 at:
|
|
* http://license.coscl.org.cn/MulanPSL2
|
|
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
|
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
|
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
|
* See the Mulan PSL v2 for more details.
|
|
*/
|
|
|
|
/**
|
|
* @file TestCirculararea.c
|
|
* @brief support to test circular area function
|
|
* @version 1.0
|
|
* @author AIIT XUOS Lab
|
|
* @date 2021-04-24
|
|
*/
|
|
|
|
#include <device.h>
|
|
#include <string.h>
|
|
#ifdef KERNEL_CIRCULAR_AREA
|
|
|
|
#define READ_LENGTH 2
|
|
#define Write_LENGTH 3
|
|
#define CIRCULARAREA_LENGTH 8
|
|
|
|
static struct CircularArea *g_circular_area;
|
|
static int8 test_string[] = "Aiit-XiuOs";
|
|
|
|
static int32 task_caread;
|
|
static int32 task_cawrite;
|
|
|
|
int data_lock = -1;
|
|
|
|
static void CircularArea_ReadTsk_Entry(void *parameter)
|
|
{
|
|
uint8 i;
|
|
uint8 read_string[8] = {0};
|
|
uint8 read_cnt = 0;
|
|
|
|
while(read_cnt < 30)
|
|
{
|
|
KMutexObtain(data_lock, WAITING_FOREVER);
|
|
|
|
if(EOK == g_circular_area->CircularAreaOperations->read(g_circular_area, read_string, READ_LENGTH)){
|
|
for(i = 0; i < READ_LENGTH; i ++){
|
|
KPrintf("Read data i %u ch %c rdidx %u wridx %u\n", i, read_string[i], g_circular_area->readidx, g_circular_area->writeidx);
|
|
}
|
|
|
|
#ifdef Test_Dbg
|
|
KPrintf("Read TSK writeidx %u readidx %u status %u len %u\n",
|
|
g_circular_area->writeidx,
|
|
g_circular_area->readidx,
|
|
g_circular_area->b_status,
|
|
CircularAreaGetDataLength(g_circular_area));
|
|
#endif
|
|
}
|
|
|
|
read_cnt++;
|
|
MdelayKTask(500);
|
|
|
|
KMutexAbandon(data_lock);
|
|
}
|
|
|
|
KMutexDelete(data_lock);
|
|
KTaskDelete(task_caread);
|
|
g_circular_area->CircularAreaOperations->release(g_circular_area);
|
|
}
|
|
|
|
static void CircularAreaWriteTskEntry(void *parameter)
|
|
{
|
|
uint8 i;
|
|
uint8 write_cnt = 0;
|
|
uint8 string_length = strlen(test_string);
|
|
static uint32 single_write_length = 0;
|
|
|
|
while(write_cnt < 30)
|
|
{
|
|
KMutexObtain(data_lock, WAITING_FOREVER);
|
|
|
|
uint8 write_string[CIRCULARAREA_LENGTH] = {0};
|
|
if((write_cnt % string_length + Write_LENGTH) > string_length){
|
|
memcpy(write_string, &test_string[write_cnt % string_length], string_length - write_cnt % string_length);
|
|
memcpy(&write_string[string_length - write_cnt % string_length], test_string, Write_LENGTH - string_length + write_cnt % string_length);
|
|
}
|
|
else{
|
|
memcpy(write_string, &test_string[write_cnt % string_length], Write_LENGTH);
|
|
}
|
|
|
|
if(EOK == g_circular_area->CircularAreaOperations->write(g_circular_area, write_string, Write_LENGTH, 0))
|
|
{
|
|
for(i = 0; i < Write_LENGTH; i ++) {
|
|
KPrintf("Write data i %d ch %c rdidx %u wridx %u\n", i, write_string[i], g_circular_area->readidx, g_circular_area->writeidx);
|
|
}
|
|
write_cnt += (g_circular_area->writeidx - single_write_length + CIRCULARAREA_LENGTH) % CIRCULARAREA_LENGTH;
|
|
single_write_length = g_circular_area->writeidx;
|
|
}
|
|
|
|
#ifdef Test_Dbg
|
|
KPrintf("Write TSK writeidx %u readidx %u status %u len %u\n",
|
|
g_circular_area->writeidx,
|
|
g_circular_area->readidx,
|
|
g_circular_area->b_status,
|
|
CircularAreaGetDataLength(g_circular_area));
|
|
#endif
|
|
MdelayKTask(500);
|
|
|
|
KMutexAbandon(data_lock);
|
|
}
|
|
|
|
KTaskDelete(task_cawrite);
|
|
}
|
|
|
|
static uint32 TestCirculararea(void)
|
|
{
|
|
x_err_t flag;
|
|
|
|
g_circular_area = CircularAreaInit(CIRCULARAREA_LENGTH);
|
|
if(g_circular_area){
|
|
KPrintf("CircularAreaInit done buffer 0x%8p length %u phead 0x%8p ptail 0x%8p wridx %u rdidx %u\n",
|
|
g_circular_area->data_buffer, g_circular_area->area_length,
|
|
g_circular_area->p_head, g_circular_area->p_tail,
|
|
g_circular_area->writeidx, g_circular_area->readidx);
|
|
}
|
|
else{
|
|
KPrintf("CircularAreaInit failed!Just return\n");
|
|
CircularAreaRelease(g_circular_area);
|
|
return ERROR;
|
|
}
|
|
|
|
data_lock = KMutexCreate();
|
|
if (data_lock < 0){
|
|
KPrintf("data_lock creat failed.\n");
|
|
g_circular_area->CircularAreaOperations->release(g_circular_area);
|
|
return ERROR;
|
|
}
|
|
|
|
task_caread = KTaskCreate("task_caread", CircularArea_ReadTsk_Entry, NONE, 2048, 10);
|
|
flag = StartupKTask(task_caread);
|
|
if (EOK != flag){
|
|
KPrintf("CircularArea_Test StartupKTask task_caread failed!\n");
|
|
g_circular_area->CircularAreaOperations->release(g_circular_area);
|
|
return ERROR;
|
|
}
|
|
|
|
task_cawrite = KTaskCreate("task_cawrite", CircularAreaWriteTskEntry, NONE, 2048, 10);
|
|
flag = StartupKTask(task_cawrite);
|
|
if (EOK != flag){
|
|
KPrintf("CircularArea_Test StartupKTask task_cawrite failed!\n");
|
|
g_circular_area->CircularAreaOperations->release(g_circular_area);
|
|
return ERROR;
|
|
}
|
|
|
|
return EOK;
|
|
}
|
|
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC)|SHELL_CMD_PARAM_NUM(0),
|
|
TestCirculararea, TestCirculararea, Test the Circular Area Function);
|
|
#endif |