23/07/17 Deal Complicts.

This commit is contained in:
涂煜洋 2023-07-17 14:17:16 +08:00
commit 115f6671e1
21 changed files with 2111 additions and 195 deletions

View File

@ -163,6 +163,8 @@ static int Ec200tIoctl(struct Adapter *adapter, int cmd, void *args)
serial_cfg.serial_parity_mode = PARITY_NONE;
serial_cfg.serial_bit_order = STOP_BITS_1;
serial_cfg.serial_invert_mode = NRZ_NORMAL;
//serial receive timeout 10s
serial_cfg.serial_timeout = 10000;
serial_cfg.is_ext_uart = 0;
#ifdef ADAPTER_EC200T_DRIVER_EXT_PORT
serial_cfg.is_ext_uart = 1;

View File

@ -1,22 +1,22 @@
/****************************************************************************
* boards/arm/imx6/sabre-lite/include/board.h
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. The
* ASF licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
****************************************************************************/
/*
* Copyright (c) 2020 AIIT XUOS Lab
* XiOS 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 board.h
* @brief sabre-lite board.h file
* @version 1.0
* @author AIIT XUOS Lab
* @date 2023.05.15
*/
#ifndef __BOARDS_ARM_IMX6_SABRE_LITE_INCLUDE_BOARD_H
#define __BOARDS_ARM_IMX6_SABRE_LITE_INCLUDE_BOARD_H

View File

@ -1,22 +1,22 @@
/****************************************************************************
* boards/arm/imx6/sabre-lite/include/board_memorymap.h
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. The
* ASF licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
****************************************************************************/
/*
* Copyright (c) 2020 AIIT XUOS Lab
* XiOS 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 board_memorymap.h
* @brief sabre-lite board memorymap
* @version 1.0
* @author AIIT XUOS Lab
* @date 2023.05.15
*/
#ifndef __BOARDS_ARM_IMX6_SABRE_LITE_INCLUDE_BOARD_MEMORYMAP_H
#define __BOARDS_ARM_IMX6_SABRE_LITE_INCLUDE_BOARD_MEMORYMAP_H

View File

@ -1,22 +1,22 @@
/****************************************************************************
* boards/arm/imx6/sabre-lite/src/imx_appinit.c
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. The
* ASF licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
****************************************************************************/
/*
* Copyright (c) 2020 AIIT XUOS Lab
* XiOS 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 imx_appinit.c
* @brief sabre-lite imx_appinit.c file
* @version 1.0
* @author AIIT XUOS Lab
* @date 2023.05.15
*/
/****************************************************************************
* Included Files

View File

@ -1,22 +1,22 @@
/****************************************************************************
* boards/arm/imx6/sabre-lite/src/imx_autoleds.c
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. The
* ASF licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
****************************************************************************/
/*
* Copyright (c) 2020 AIIT XUOS Lab
* XiOS 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 imx_autoleds.c
* @brief sabre-lite imx_autoleds.c file
* @version 1.0
* @author AIIT XUOS Lab
* @date 2023.05.15
*/
/* LEDs
*

View File

@ -1,22 +1,22 @@
/****************************************************************************
* boards/arm/imx6/sabre-lite/src/imx_boardinit.c
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. The
* ASF licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
****************************************************************************/
/*
* Copyright (c) 2020 AIIT XUOS Lab
* XiOS 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 imx_boardinit.c
* @brief sabre-lite imx_boardinit.c file
* @version 1.0
* @author AIIT XUOS Lab
* @date 2023.05.15
*/
/****************************************************************************
* Included Files

View File

@ -1,22 +1,22 @@
/****************************************************************************
* boards/arm/imx6/sabre-lite/src/imx_bringup.c
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. The
* ASF licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
****************************************************************************/
/*
* Copyright (c) 2020 AIIT XUOS Lab
* XiOS 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 imx_bringup.c
* @brief sabre-lite imx_bringup.c file
* @version 1.0
* @author AIIT XUOS Lab
* @date 2023.05.15
*/
/****************************************************************************
* Included Files

View File

@ -1,22 +1,22 @@
/****************************************************************************
* boards/arm/imx6/sabre-lite/src/imx_userleds.c
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. The
* ASF licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
****************************************************************************/
/*
* Copyright (c) 2020 AIIT XUOS Lab
* XiOS 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 imx_userleds.c
* @brief sabre-lite imx_userleds.c file
* @version 1.0
* @author AIIT XUOS Lab
* @date 2023.05.15
*/
/****************************************************************************
* Included Files

View File

@ -1,22 +1,22 @@
/****************************************************************************
* boards/arm/imx6/sabre-lite/src/sabre-lite.h
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. The
* ASF licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
****************************************************************************/
/*
* Copyright (c) 2020 AIIT XUOS Lab
* XiOS 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 sabre-lite.h
* @brief sabre-lite sabre-lite.h file
* @version 1.0
* @author AIIT XUOS Lab
* @date 2023.05.15
*/
#ifndef __BOARDS_ARM_IMX6_SABRE_LITE_SRC_SABRE_LITE_H
#define __BOARDS_ARM_IMX6_SABRE_LITE_SRC_SABRE_LITE_H

View File

@ -1,3 +1,3 @@
SRC_FILES := task.c schedule.c ipc.c
SRC_FILES := schedule.c ipc.c
include $(KERNEL_ROOT)/compiler.mk

View File

@ -0,0 +1,537 @@
/*
* 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: task.c
* @brief: file task.c
* @version: 1.0
* @author: AIIT XUOS Lab
* @date: 2023/05/18
*
*/
#include <task.h>
// 全局运行队列和本地运行队列
tcb_t *global_run_queue_head = NULL;
tcb_t *global_run_queue_tail = NULL;
tcb_t *local_run_queue_head[8] = {NULL};
tcb_t *local_run_queue_tail[8] = {NULL};
// 当前任务的指针
volatile tcb_t *current_task = NULL;
/*******************************************************************************
* : tcb_init
* :
* : tcb:,priority:,stack_size:
* :
*******************************************************************************/
void tcb_init(tcb_t *tcb, int priority, int stack_size) {
tcb->priority = priority;
tcb->state = TASK_CREATED;
tcb->message_queue = NULL;
tcb->stack = (uint8_t*)malloc(stack_size);
tcb->stack_size = stack_size;
tcb->stack_ptr = tcb->stack + stack_size - sizeof(context_t);
// 将任务的上下文保存在栈中
context_t *context = (context_t*)tcb->stack_ptr;
context_init(context, (void*)task_entry, tcb->stack_ptr);
}
/*******************************************************************************
* : tcb_destroy
* :
* : tcb:
* :
*******************************************************************************/
void tcb_destroy(tcb_t *tcb) {
free(tcb->stack_bottom);
tcb->stack_ptr = NULL;
tcb->stack_bottom = NULL;
tcb->stack_size = 0;
tcb->state = TASK_BLOCKED;
tcb->priority = 0;
tcb->next = NULL;
if (tcb->message_queue != NULL) {
message_queue_destroy(tcb->message_queue);
tcb->message_queue = NULL;
}
}
/*******************************************************************************
* : get_current_task
* :
* :
* :
*******************************************************************************/
tcb_t *get_current_task() {
return (tcb_t*)current_task;
}
/*******************************************************************************
* : get_local_run_queue_head
* :
* : cpu_id:cpu的id
* :
*******************************************************************************/
tcb_t *get_local_run_queue_head(int cpu_id) {
return local_run_queue_head[cpu_id];
}
/*******************************************************************************
* : add_to_global_run_queue
* :
* : tcb:
* :
*******************************************************************************/
void add_to_global_run_queue(tcb_t *tcb) {
// 将任务添加到全局运行队列的尾部
if (global_run_queue_head == NULL) {
global_run_queue_head = tcb;
global_run_queue_tail = tcb;
} else {
global_run_queue_tail->next = tcb;
global_run_queue_tail = tcb;
}
}
/*******************************************************************************
* : take_from_global_run_queue
* :
* :
* : tcb:
*******************************************************************************/
tcb_t *take_from_global_run_queue() {
// 从全局运行队列的头部取出一个任务
if (global_run_queue_head == NULL) {
return NULL;
} else {
tcb_t *tcb = global_run_queue_head;
global_run_queue_head = tcb->next;
if (global_run_queue_head == NULL) {
global_run_queue_tail = NULL;
}
return tcb;
}
}
/*******************************************************************************
* : add_to_local_run_queue
* :
* : tcb:,cpu_id:CPU id
* :
*******************************************************************************/
void add_to_local_run_queue(tcb_t *tcb, int cpu_id) {
// 将任务添加到本地运行队列的尾部
if (local_run_queue_head[cpu_id] == NULL) {
local_run_queue_head[cpu_id] = tcb;
local_run_queue_tail[cpu_id] = tcb;
} else {
local_run_queue_tail[cpu_id]->next = tcb;
local_run_queue_tail[cpu_id] = tcb;
}
}
/*******************************************************************************
* : take_from_local_run_queue
* :
* : cpu_id:CPU id
* :
*******************************************************************************/
tcb_t *take_from_local_run_queue(int cpu_id) {
// 从本地运行队列的头部取出一个任务
if (local_run_queue_head[cpu_id] == NULL) {
return NULL;
} else {
tcb_t *tcb = local_run_queue_head[cpu_id];
local_run_queue_head[cpu_id] = tcb->next;
if (local_run_queue_head[cpu_id] == NULL) {
local_run_queue_tail[cpu_id] = NULL;
}
return tcb;
}
}
/*******************************************************************************
* : move_current_task_to_global_run_queue
* : ,
* :
* :
*******************************************************************************/
void move_current_task_to_global_run_queue() {
int cpu_id = get_cpu_id();
tcb_t *tcb = (tcb_t*)current_task;
tcb->state = TASK_READY;
add_to_global_run_queue(tcb);
local_run_queue_head[cpu_id] = NULL;
local_run_queue_tail[cpu_id] = NULL;
current_task = NULL;
}
/*******************************************************************************
* : switch_to_next_task
* :
* :
* :
*******************************************************************************/
void switch_to_next_task() {
int cpu_id = get_cpu_id();
tcb_t *current_tcb = (tcb_t*)current_task;
tcb_t *next_tcb = take_from_local_run_queue(cpu_id);
if (next_tcb == NULL) {
next_tcb = take_from_global_run_queue();
}
if (next_tcb == NULL) {
// 如果没有可运行的任务,则将当前任务继续运行
return;
}
// 保存当前任务的上下文
if (current_tcb != NULL) {
current_tcb->stack_ptr = get_stack_pointer();
}
// 切换到下一个任务的上下文
current_task = next_tcb;
set_stack_pointer(next_tcb->stack_ptr);
// 如果切换到的任务是新的任务,需要执行任务初始化函数
if (current_tcb != next_tcb) {
next_tcb->state = TASK_RUNNING;
task_init(next_tcb);
}
}
/*******************************************************************************
* : task_init
* :
* : tcb:
* :
*******************************************************************************/
void task_init(tcb_t *tcb) {
// 创建消息队列
message_queue_t mq = (message_queue_t)malloc(sizeof(message_queue_t));
mq->buffer = (message_t)malloc(sizeof(message_t) * 16);
mq->capacity = 16;
mq->head = 0;
mq->tail = 0;
mq->count = 0;
tcb->message_queue = mq;
}
/*******************************************************************************
* : create_task
* :
* : priority:,stack_size:
* :
*******************************************************************************/
tcb_t *create_task(int priority, int stack_size) {
tcb_t *tcb = (tcb_t*)malloc(sizeof(tcb_t));
tcb_init(tcb, priority, stack_size);
add_to_global_run_queue(tcb);
return tcb;
}
/*******************************************************************************
* : destroy_task
* :
* : tcb:
* :
*******************************************************************************/
void destroy_task(tcb_t *tcb) {
tcb_destroy(tcb);
free(tcb);
}
/*******************************************************************************
* : send_message
* :
* : dest_tcb:,type:,data:
* :
*******************************************************************************/
void send_message(tcb_t *dest_tcb, int type, void *data) {
message_t message;
message.type = type;
message.data = data;
if (dest_tcb->message_queue == NULL) {
// 如果目标任务没有消息队列,则创建一个消息队列
dest_tcb->message_queue = message_queue_create(16);
}
// 将消息添加到目标任务的消息队列中
message_queue_push(dest_tcb->message_queue, &message);
}
/*******************************************************************************
* : receive_message
* :
* : type:,data:
* :
*******************************************************************************/
void receive_message(int type, void *data) {
tcb_t *current_tcb = (tcb_t*)current_task;
message_t message;
// 从当前任务的消息队列中取出消息
while (message_queue_pop(current_tcb->message_queue, &message) != 0) {
if (message.type == type) {
// 如果消息的类型匹配,则返回消息数据
memcpy(data, message.data, sizeof(void*));
return;
}
}
// 如果没有匹配的消息,则当前任务被阻塞,直到有匹配的消息为止
current_tcb->state = TASK_BLOCKED;
while (message_queue_pop(current_tcb->message_queue, &message) != 0) {
if (message.type == type) {
// 如果有匹配的消息,则返回消息数据,并将当前任务状态设置为就绪
memcpy(data, message.data, sizeof(void*));
current_tcb->state = TASK_READY;
return;
}
}
// 如果还是没有匹配的消息,则当前任务一直被阻塞
while (1) {
wait_for_interrupt();
}
}
/*******************************************************************************
* : message_queue_create
* :
* : capacity:
* :
*******************************************************************************/
message_queue_t *message_queue_create(int capacity) {
message_queue_t *mq = (message_queue_t*)malloc(sizeof(message_queue_t));
mq->buffer = (message_t*)malloc(sizeof(message_t) * capacity);
mq->capacity = capacity;
mq->head = 0;
mq->tail = 0;
mq->count = 0;
return mq;
}
/*******************************************************************************
* : message_queue_destroy
* :
* : mq:
* :
*******************************************************************************/
void message_queue_destroy(message_queue_t *mq) {
free(mq->buffer);
free(mq);
}
/*******************************************************************************
* : message_queue_push
* :
* : message_queue_t:,message_t:
* : 0:,-1:
*******************************************************************************/
int message_queue_push(message_queue_t *mq, message_t *message) {
if (mq->count >= mq->capacity) {
return -1; // 队列已满
}
mq->buffer[mq->tail] = *message;
mq->tail = (mq->tail + 1) % mq->capacity;
mq->count++;
return 0;
}
/*******************************************************************************
* : message_queue_pop
* :
* : message_queue_t:,message_t:
* : 0:,-1:
*******************************************************************************/
int message_queue_pop(message_queue_t *mq, message_t *message) {
if (mq->count <= 0) {
return -1; // 队列已空
}
*message = mq->buffer[mq->head];
mq->head = (mq->head + 1) % mq->capacity;
mq->count--;
return 0;
}
/*******************************************************************************
* : context_init
* :
* : message_queue_t:,message_t:
* : 0:,-1:
*******************************************************************************/
void context_init(context_t *context, void (*entry)(void), void *stack_ptr) {
context->cpsr = 0x10; // 设置 CPSR 的初始值
context->pc = (uint32_t)entry; // 设置 PC 的初始值为任务入口地址
context->r0 = (uint32_t)stack_ptr; // 设置 R0 的初始值为栈指针
context->r1 = 0; // 设置 R1 的初始值为 0
context->r2 = 0; // 设置 R2 的初始值为 0
context->r3 = 0; // 设置 R3 的初始值为 0
context->r4 = 0; // 设置 R4 的初始值为 0
context->r5 = 0; // 设置 R5 的初始值为 0
context->r6 = 0; // 设置 R6 的初始值为 0
context->r7 = 0; // 设置 R7 的初始值为 0
context->r8 = 0; // 设置 R8 的初始值为 0
context->r9 = 0; // 设置 R9 的初始值为 0
context->r10 = 0; // 设置 R10 的初始值为 0
context->r11 = 0; // 设置 R11 的初始值为 0
context->r12 = 0; // 设置 R12 的初始值为 0
context->sp = (uint32_t)stack_ptr; // 设置 SP 的初始值为栈指针
context->lr = (uint32_t)task_exit; // 设置 LR 的初始值为线程退出函数的地址
}
/*******************************************************************************
* : wait_for_interrupt
* :
* :
* :
*******************************************************************************/
void wait_for_interrupt() {
// 在实现中,可以使用 WFI 指令等待中断
__asm__ volatile("wfi");
}
/*******************************************************************************
* : get_cpu_id
* : CPU id
* :
* : cpu id
*******************************************************************************/
int get_cpu_id() {
uint32_t mpidr;
__asm__ volatile("mrc p15, 0, %0, c0, c0, 5" : "=r"(mpidr));
return mpidr & 0xff;
}
/*******************************************************************************
* : get_stack_pointer
* :
* :
* :
*******************************************************************************/
void *get_stack_pointer() {
// 在实现中,可以使用 ARM 的 SP 寄存器获取栈指针
void *sp;
__asm__ volatile("mov %0, sp" : "=r"(sp));
return sp;
}
/*******************************************************************************
* : set_stack_pointer
* :
* :
* :
*******************************************************************************/
void set_stack_pointer(void *sp) {
// 在实现中,可以使用 ARM 的 SP 寄存器设置栈指针
__asm__ volatile("mov sp, %0" : : "r"(sp));
}
/*******************************************************************************
* : add_interrupt_handler
* :
* : irq:,handler:,priority:
* :
*******************************************************************************/
void add_interrupt_handler(int irq, void (*handler)(void), int priority) {
uint32_t *vector_table = (uint32_t*)0x0;
// 将中断处理函数写入中断向量表中
vector_table[irq + 16] = (uint32_t)handler;
// 设置中断优先级
uint8_t priority_shift = 8 - __NVIC_PRIO_BITS;
uint32_t priority_mask = 0xff << priority_shift;
uint32_t priority_value = (priority << priority_shift) & priority_mask;
uint32_t *priority_reg = (uint32_t*)0xE000E400;
int index = irq / 4;
int offset = irq % 4;
priority_reg[index] &= ~(0xff << (offset * 8));
priority_reg[index] |= (priority_value << (offset * 8));
// 使能中断
uint32_t *enable_reg = (uint32_t*)0xE000E100;
enable_reg[irq / 32] |= 1 << (irq % 32);
}
/*******************************************************************************
* : enter_critical
* :
* :
* :
*******************************************************************************/
void enter_critical() {
// 在实现中,可以使用 ARM 的 CPSR 寄存器进入临界区
__asm__ volatile("cpsid i");
}
/*******************************************************************************
* : leave_critical
* :
* :
* :
*******************************************************************************/
void leave_critical() {
// 在实现中,可以使用 ARM 的 CPSR 寄存器离开临界区
__asm__ volatile("cpsie i");
}
/*******************************************************************************
* : task_exit
* : 退
* :
* :
*******************************************************************************/
void task_exit() {
// 切换到下一个任务
switch_to_next_task();
// 在实现中,可以使用 ARM 的 WFE 指令等待下一个中断
__asm__ volatile("wfe");
}
/*******************************************************************************
* : task_entry
* :
* :
* :
*******************************************************************************/
void task_entry() {
tcb_t *current_tcb = (tcb_t*)current_task;
current_tcb->state = TASK_RUNNING;
task_init(current_tcb);
while (1) {
switch_to_next_task();
}
}

View File

@ -0,0 +1,135 @@
/*
* 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: task.h
* @brief: file task.h
* @version: 1.0
* @author: AIIT XUOS Lab
* @date: 2023/05/18
*
*/
#ifndef __TASK_H__
#define __TASK_H__
#include <stdio.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
// 任务状态枚举类型
typedef enum {
TASK_CREATED, // 初始状态
TASK_READY, // 就绪状态
TASK_RUNNING, // 运行状态
TASK_BLOCKED, // 阻塞状态
} task_state_t;
// 任务控制块结构体
typedef struct tcb {
uint32_t *stack_ptr; // 任务堆栈指针
uint32_t *stack_bottom; // 任务堆栈底部指针
uint32_t stack_size; // 任务堆栈大小
task_state_t state; // 任务状态
int priority; // 任务优先级
struct tcb *next; // 指向下一个任务控制块的指针
struct message_queue *message_queue; // 消息队列
} tcb_t;
// 消息结构体
typedef struct message {
int type; // 消息类型
void *data; // 消息数据指针
} message_t;
// 消息队列结构体
typedef struct message_queue {
message_t *buffer; // 消息缓冲区
int capacity; // 缓冲区容量
int count; // 当前缓冲区中的消息数量
int head; // 队头指针
int tail; // 队尾指针
semaphore_t *semaphore; // 信号量,用于实现消息队列的同步机制
} message_queue_t;
// 信号量结构体
typedef struct semaphore {
int count; // 计数器
tcb_t *wait_list_head; // 指向等待信号量的任务控制块的指针
mutex_t mutex; // 互斥锁,用于保护信号量和等待队列的访问
} semaphore_t;
// 互斥锁结构体
typedef struct mutex {
int lock; // 锁标志
} mutex_t;
// 上下文结构体
typedef struct {
uint32_t cpsr; // 控制寄存器
uint32_t pc; // 程序计数器
uint32_t r0; // 寄存器 R0
uint32_t r1; // 寄存器 R1
uint32_t r2; // 寄存器 R2
uint32_t r3; // 寄存器 R3
uint32_t r4; // 寄存器 R4
uint32_t r5; // 寄存器 R5
uint32_t r6; // 寄存器 R6
uint32_t r7; // 寄存器 R7
uint32_t r8; // 寄存器 R8
uint32_t r9; // 寄存器 R9
uint32_t r10; // 寄存器 R10
uint32_t r11; // 寄存器 R11
uint32_t r12; // 寄存器 R12
uint32_t sp; // 栈指针
uint32_t lr; // 链接寄存器
} context_t;
void tcb_init(tcb_t *tcb, int priority, int stack_size);
void tcb_destroy(tcb_t *tcb);
tcb_t *get_current_task(void);
tcb_t *get_local_run_queue_head(int cpu_id);
void add_to_global_run_queue(tcb_t *tcb);
tcb_t *take_from_global_run_queue(void);
void add_to_local_run_queue(tcb_t *tcb, int cpu_id);
tcb_t *take_from_local_run_queue(int cpu_id);
void move_current_task_to_global_run_queue(void);
void switch_to_next_task(void);
void task_init(tcb_t *tcb);
tcb_t *create_task(int priority, int stack_size);
void destroy_task(tcb_t *tcb);
void send_message(tcb_t *dest_tcb, int type, void *data);
void receive_message(int type, void *data);
message_queue_t *message_queue_create(int capacity);
void message_queue_destroy(message_queue_t *mq);
int message_queue_push(message_queue_t *mq, message_t *message);
int message_queue_pop(message_queue_t *mq, message_t *message);
int message_queue_push(message_queue_t *mq, message_t *message);
void context_init(context_t *context, void (*entry)(void), void *stack_ptr);
void wait_for_interrupt(void);
int get_cpu_id(void);
void *get_stack_pointer(void);
void set_stack_pointer(void *sp);
void add_interrupt_handler(int irq, void (*handler)(void), int priority);
void enter_critical(void);
void leave_critical(void);
void task_exit(void);
void task_entry(void);
#endif

View File

@ -11,7 +11,7 @@ menuconfig BSP_USING_SPI
bool "Using SPI device"
default n
select RESOURCES_SPI
select BSP_USING_DMA
select BSP_USING_DMA
if BSP_USING_SPI
source "$BSP_DIR/third_party_driver/spi/Kconfig"
endif
@ -117,6 +117,7 @@ menuconfig BSP_USING_WIZCHIP
bool "Using w5500 as network device"
default n
select RESOURCES_WIZCHIP
select BSP_USING_SPI
if BSP_USING_WIZCHIP
source "$BSP_DIR/third_party_driver/ethernet/Kconfig"
endif

View File

@ -1,15 +1,17 @@
# Kconfig file
config BSP_USING_W5500
bool "Using w5500 "
default y
bool "Using w5500"
default y
# if BSP_USING_W5500
config BSP_WIZ_RST_PIN
int
default 13
config BSP_WIZ_RST_PIN
int
default 13
config BSP_WIZ_INT_PIN
int
default 14
# endif
config BSP_WIZ_INT_PIN
int
default 14
config BSP_WIZ_USE_IPERF
bool "Using iperf"
default y

View File

@ -2,6 +2,8 @@
#include "w5500.h"
#include "connect_w5500.h"
#ifdef BSP_WIZ_USE_IPERF
#define IPERF_PORT 5001
#define IPERF_BUFSZ (4 * 1024)
@ -459,4 +461,5 @@ __usage:
}
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN),
iperf, iperf,
iperf throughput test);
iperf throughput test);
#endif

View File

@ -536,7 +536,7 @@ The STM32F4x7 allows computing and verifying the IP, UDP, TCP and ICMP checksums
#define DEFAULT_THREAD_STACKSIZE 1024
#define TCPIP_THREAD_NAME "tcp"
#define TCPIP_THREAD_STACKSIZE 4096
#define TCPIP_THREAD_STACKSIZE 1024
#define TCPIP_MBOX_SIZE 16
#define TCPIP_THREAD_PRIO 20

View File

@ -54,7 +54,7 @@
#define LWIP_TARGET_PORT LWIP_LOCAL_PORT
#define LWIP_DEMO_TIMES 10
#define LWIP_TASK_STACK_SIZE 4096
#define LWIP_TASK_STACK_SIZE 1536
#define LWIP_DEMO_TASK_PRIO 20
// /* MAC address configuration. */

View File

@ -28,7 +28,7 @@
#include "tcpecho_raw.h"
char tcp_demo_msg[LWIP_TEST_MSG_SIZE] = { 0 };
char tcp_demo_ip[] = {192, 168, 250, 252};
u16_t tcp_demo_port = LWIP_TARGET_PORT;
u16_t tcp_demo_port = 80;
int tcp_send_num = 0;
int tcp_send_task_on = 0;
uint32 tcp_interval = 50;