forked from xuos/xiuos
First commit XiUOS
This commit is contained in:
160
kernel/kernel_test/test_circulararea.c
Normal file
160
kernel/kernel_test/test_circulararea.c
Normal file
@@ -0,0 +1,160 @@
|
||||
/*
|
||||
* 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
|
||||
Reference in New Issue
Block a user