多线程测试

This commit is contained in:
zhangzheng
2022-12-14 21:38:19 +08:00
parent 33ce7e829c
commit 5227a897b9
14 changed files with 156 additions and 44 deletions

View File

@@ -68,7 +68,8 @@
"mm.h": "c",
"atomic.h": "c",
"slist.h": "c",
"exec.h": "c"
"exec.h": "c",
"bitset": "c"
},
"cortex-debug.showRTOS": false
}

View File

@@ -80,4 +80,4 @@ static int reg_early_console(void)
console_reg(0);
return 0;
}
INIT_REG(reg_early_console, INIT_TEST_REG);
INIT_REG(reg_early_console, INIT_FUNC_REG);

View File

@@ -50,7 +50,7 @@ static struct file_operations bk_ops = { .open = bk_file_open, .read =
dev_t used_dev_no = BK_FLASH;
#define DEV_NAME "flash"
/**
* ע<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* 注册设备驱动,注册成功返回设备驱动号
* @return
*/
int32_t bk_flash_init(void) {

View File

@@ -10,7 +10,7 @@
#include <arch/arch.h>
#include <mkrtos.h>
typedef int (*init_func)(void); //!< 初始化函数
#define SYS_NAME "mkrtos"
#define SYS_VERSION "0.01"
#define SYS_RELEASE "0.01"
@@ -22,6 +22,7 @@
#define SECTION(x) __attribute__((section(x)))
//自动初始化接口
#define INIT_LV0(name) const init_func mkrtos_init_func_##name SECTION(".mkrtos.init.0") = name
#define INIT_LV1(name) const init_func mkrtos_init_func_##name SECTION(".mkrtos.init.1") = name
#define INIT_LV2(name) const init_func mkrtos_init_func_##name SECTION(".mkrtos.init.2") = name
@@ -30,9 +31,40 @@
#define INIT_REG(name, LVL)\
const init_func mkrtos_init_func_##name SECTION(".mkrtos.init."LVL) = name
#define INIT_TEST_REG "3"
#define INIT_TEST_LVL "4"
#define INIT_FUNC_REG "3"
#define INIT_PRE_BOOT "4"
/**
* @brief 初始化调用
*
*/
static inline void mkrtos_init(void){
extern ptr_t _mkrtos_init_start,_mkrtos_init_end;
ptr_t* func_start=(ptr_t*)(&_mkrtos_init_start);
ptr_t* func_stop=(ptr_t*)(&_mkrtos_init_end);
for(;func_start<func_stop;func_start++){
((init_func)(*func_start))();
}
}
//自动测试接口
#define INIT_TEST_REG(name, LVL)\
const init_func mkrtos_init_test_func##name SECTION(".mkrtos.test."LVL) = name
#define INIT_TEST_LVL "5"
/**
* @brief 测试自动调用
*
*/
static inline void mkrtos_test(void){
extern ptr_t _mkrtos_init_test_start,_mkrtos_init_test_end;
ptr_t* func_start=(ptr_t*)(&_mkrtos_init_test_start);
ptr_t* func_stop=(ptr_t*)(&_mkrtos_init_test_end);
for(;func_start<func_stop;func_start++){
((init_func)(*func_start))();
}
}
#define ARCH_INIT() arch_init()

View File

@@ -88,7 +88,7 @@ static inline int is_power_of_2(int num){
\
}while(0)
typedef int (*init_func)(void); //!< 初始化函数
typedef int (*sys_call_func)(void); //!< 系统调用函数
#endif /* INC_MKRTOS_H_ */

View File

@@ -160,8 +160,9 @@ struct sys_tasks {
slist_head_t all_tk_list; //!< 所有的任务链表
atomic_t pid_temp; //!< 创建任务分配任务ID使用
uint16_t tasks_count; //!< 系统任务数
atomic_t wait_r; //!< 是否有进程等待释放
uint8_t is_first; //!< 是否首次,是为0不是为1
uint8_t wait_r; //!< 是否有进程等待释放
uint8_t is_run; //!< 系统是否启动完成
};
//等待链表

View File

@@ -15,7 +15,7 @@
void do_exit(int32_t exitCode) {
//关所有中断
uint32_t t;
kprint("kill pid is %d.\n", get_current_task()->pid);
//kprint("kill pid is %d.\n", get_current_task()->pid);
if (get_current_task()->status == TASK_CLOSED) {
return;
}
@@ -81,7 +81,7 @@ void do_exit(int32_t exitCode) {
// #if MEM_TRACE
// knl_mem_trace();
// #endif
get_sys_tasks_info()->wait_r++;
atomic_inc(&get_sys_tasks_info()->wait_r);
restore_cpu_intr(t);
}
///**

View File

@@ -11,19 +11,7 @@
#include <mm.h>
#include <mkrtos/early_console.h>
extern ptr_t _mkrtos_init_start,_mkrtos_init_end;
/**
* @brief 初始化调用
*
*/
static void mkrtos_init(void){
ptr_t* func_start=(ptr_t*)(&_mkrtos_init_start);
ptr_t* func_stop=(ptr_t*)(&_mkrtos_init_end);
for(;func_start<func_stop;func_start++){
((init_func)(*func_start))();
}
}
/**
* @brief 第一个C函数
*

View File

@@ -125,7 +125,10 @@ void sche_lock(void) {
* 调度器解锁
*/
void sche_unlock(void) {
atomic_test_dec_nq(&(sys_tasks_info.sche_lock));
atomic_dec(&(sys_tasks_info.sche_lock));
if (atomic_read(&(sys_tasks_info.sche_lock)) == 0 && sys_tasks_info.is_run) {
task_sche();
}
}
/**
* 获取调度器的锁计数
@@ -145,7 +148,7 @@ void task_sche(void) {
return;
}
//监测是否可以调度
if (atomic_test(&(sys_tasks_info.sche_lock), FALSE)) {
if (!atomic_test(&(sys_tasks_info.sche_lock), 0)) {
return;
}
t = dis_cpu_intr();
@@ -562,13 +565,22 @@ int32_t sys_nice(int32_t increment) {
return 0;
}
// /**
// * 结束时系统将会调用这函数
// * 非内核线程时,这个函数属于用户态
// * 内核线程时,这个函数删除线程
// */
// void task_end(void) {
// sys_exit(0);
// task_sche();
// }
/**
* 结束时系统将会调用这函数
* 非内核线程时,这个函数属于用户态
* 内核线程时,这个函数删除线程
*/
void task_end(void) {
sys_exit(0);
do_exit(0);
}
/**
* @brief 创建任务
@@ -785,11 +797,9 @@ pid_t shutdown_task(struct task *ls) {
void thread_idle(void *arg) {
int last_r_cn = 0;
while (1) {
//TODO:
if (sys_tasks_info.wait_r) {
if (!atomic_test_dec_nq(&sys_tasks_info.wait_r)) {
struct task *all;
sys_tasks_info.wait_r--;
sche_lock();
again:
slist_foreach(all, &sys_tasks_info.all_tk_list, all_node) {
@@ -826,7 +836,7 @@ void init_sche(void) {
slist_init(&sys_tasks_info.all_tk_list);
slist_init(&sys_tasks_info.prio_head_task_list);
/*OS是否调度初始化*/
atomic_set(&sys_tasks_info.sche_lock, 1);
atomic_set(&sys_tasks_info.sche_lock, 0);
/*进程pid分配变量*/
atomic_set(&sys_tasks_info.pid_temp, 1);
sys_tasks_info.current_max_task_node = NULL;

View File

@@ -19,14 +19,20 @@
//4.应用程序直接加载bin文件执行
void thread_main(void *arg0, void *arg1) {
int ret;
sys_tasks_info.is_run = TRUE;
mkrtos_test();
// #if 0
setup();
const char * const argv[] = {
"/bin/zh"
,0
};
sys_execve("/bin/zh",argv);
// #endif
kprint("done!\n");
while(1);
while(1) {
sleep_ms(1000);
}
}
// static void delay(void)
// {
@@ -36,9 +42,9 @@ void thread_main(void *arg0, void *arg1) {
// }
#include <stm32f2xx.h>
int main(void) {
//delay();
static struct task_create_par tcp;
int32_t pid;
extern int32_t bk_flash_init(void);
extern int32_t sp_mkfs(dev_t dev_no, int32_t inode_count);
__enable_irq();
// //TODO:增加栈8字节对齐
((uint8_t *)(0xE000E008))[0] |= 0x6;
@@ -47,14 +53,6 @@ int main(void) {
//初始化默认的磁盘设备
root_dev_no = bk_flash_init();
// //在这里格式化文件系统
// if (sp_mkfs(root_dev_no, 30) < 0) {
// kfatal("根文件系统创建失败!\r\n");
// }
static struct task_create_par tcp;
int32_t pid;
init_sche();
tcp.task_fun = thread_main;

View File

@@ -50,6 +50,10 @@ SECTIONS
KEEP (*(SORT(.mkrtos.init.*)))
_mkrtos_init_end = .;
. = ALIGN(4);
_mkrtos_init_test_start = .;
KEEP (*(SORT(.mkrtos.test.*)))
_mkrtos_init_test_end = .;
. = ALIGN(4);
_etext = .; /* define a global symbols at end of code */

View File

@@ -48,4 +48,4 @@ int test_mem(void)
return 0;
}
INIT_REG(test_mem, INIT_TEST_LVL);
INIT_TEST_REG(test_mem, INIT_TEST_LVL);

View File

@@ -24,4 +24,4 @@ static int test_sched(void)
return 0;
}
INIT_REG(test_sched, INIT_TEST_LVL);
INIT_TEST_REG(test_sched, INIT_TEST_LVL);

View File

@@ -0,0 +1,78 @@
#include <arch/atomic.h>
#include <mkrtos/sched.h>
#include "config.h"
#include "knl_service.h"
#include <mm.h>
static void test_thread_entry(int arg0, int arg1)
{
struct task *cur_task;
cur_task = get_current_task();
MKRTOS_ASSERT(arg0 == 1);
MKRTOS_ASSERT(arg1 == 2);
//kprint("pid:%d\n", cur_task->pid);
}
static void test_thread_prio(int arg0, int arg1)
{
struct task *cur_task;
cur_task = get_current_task();
MKRTOS_ASSERT(arg0 == 1);
MKRTOS_ASSERT(arg1 == 2);
kprint("pid:%d prio:%d\n", cur_task->pid, cur_task->prio);
}
static int test_thread(void)
{
pid_t pid;
static struct task_create_par tcp;
kprint("=======start sched mem\n");
for (int i = 0; i < 100; i++) {
tcp.task_fun = test_thread_entry;
tcp.arg0 = (void*) 1;
tcp.arg1 = 2;
tcp.prio = 6;
tcp.exec_id = -1;
tcp.user_stack_size = 0;
tcp.kernel_stack_size = 256;
tcp.task_name = "main";
pid = task_create(&tcp, TRUE);
if (pid < 0) {
sleep_ms(50);
continue;
}
}
while(atomic_read(&sys_tasks_info.wait_r)!=0) {
sleep_ms(500);
}
sleep_ms(500);
sche_lock();
for (int i = 1; i <= 3; i++) {
tcp.task_fun = test_thread_prio;
tcp.arg0 = (void*) 1;
tcp.arg1 = 2;
tcp.prio = i;
tcp.exec_id = -1;
tcp.user_stack_size = 0;
tcp.kernel_stack_size = 256;
tcp.task_name = "main";
pid = task_create(&tcp, TRUE);
if (pid < 0) {
kprint("=======prio test fail.\n");
break;
}
}
sche_unlock();
while(atomic_read(&sys_tasks_info.wait_r)!=0) {
sleep_ms(500);
}
sleep_ms(500);
knl_mem_trace();
kprint("=======end sched mem\n");
return 0;
}
INIT_TEST_REG(test_thread, INIT_TEST_LVL);