修复mpu内存分配的临界保护问题

This commit is contained in:
zhangzheng
2023-09-30 14:58:34 +08:00
parent 4827093da7
commit 79d53d573c
8 changed files with 15 additions and 17 deletions

View File

@@ -37,7 +37,7 @@ add_dependencies(mkrtos.elf knl)
add_dependencies(mkrtos.elf lib) add_dependencies(mkrtos.elf lib)
set_target_properties(mkrtos.elf PROPERTIES set_target_properties(mkrtos.elf PROPERTIES
LINK_FLAGS "-T ${CMAKE_CURRENT_SOURCE_DIR}/stm32f205rft6_link.lds -z max-page-size=0x1000 --gc-section ") LINK_FLAGS "-T ${CMAKE_CURRENT_SOURCE_DIR}/stm32_link.lds -z max-page-size=0x1000 --gc-section ")
add_custom_target( add_custom_target(
link_file_dump ALL link_file_dump ALL
@@ -47,8 +47,8 @@ add_custom_target(
-DKNL_DATA=$ENV{KNL_DATA} -DKNL_DATA=$ENV{KNL_DATA}
-DKNL_OFFSET=$ENV{KEN_OFFSET} -DKNL_OFFSET=$ENV{KEN_OFFSET}
-DKNL_DATA_SIZE=$ENV{KNL_DATA_SIZE} -DKNL_DATA_SIZE=$ENV{KNL_DATA_SIZE}
-E -P -<${CMAKE_CURRENT_SOURCE_DIR}/stm32f205rft6_link.lds.S> -E -P -<${CMAKE_CURRENT_SOURCE_DIR}/stm32_link.lds.S>
${CMAKE_CURRENT_SOURCE_DIR}/stm32f205rft6_link.lds ${CMAKE_CURRENT_SOURCE_DIR}/stm32_link.lds
) )
add_custom_target( add_custom_target(

View File

@@ -6,8 +6,8 @@
#include "types.h" #include "types.h"
#include "mm_wrap.h" #include "mm_wrap.h"
#define OBJ_MAP_TAB_SIZE 2 #define OBJ_MAP_TAB_SIZE 4
#define OBJ_MAP_ENTRY_SIZE 32 #define OBJ_MAP_ENTRY_SIZE 8
#define OBJ_MAP_MAX_ADDR ((OBJ_MAP_ENTRY_SIZE) * (OBJ_MAP_TAB_SIZE)) #define OBJ_MAP_MAX_ADDR ((OBJ_MAP_ENTRY_SIZE) * (OBJ_MAP_TAB_SIZE))

View File

@@ -26,7 +26,7 @@ enum thread_state
THREAD_IDLE, //!< 空闲状态 THREAD_IDLE, //!< 空闲状态
THREAD_DEAD, //!< 死亡状态 THREAD_DEAD, //!< 死亡状态
THREAD_SUSPEND, //!< 只有接收和发送ipc消息时才能挂起 THREAD_SUSPEND, //!< 只有接收和发送ipc消息时才能挂起
THREAD_READY, //!< 正常工作状态 THREAD_READY, //!< 在就绪队列中
THREAD_TODEAD, //!< 该标志标志线程马上要死亡了执行完必要操作后进入THREAD_DEAD状态 THREAD_TODEAD, //!< 该标志标志线程马上要死亡了执行完必要操作后进入THREAD_DEAD状态
}; };
typedef struct typedef struct
@@ -57,16 +57,14 @@ typedef struct sp_info
typedef struct msg_buf typedef struct msg_buf
{ {
void *msg; //!< buf长度是固定的 @see THREAD_MSG_BUG_LEN void *msg; //!< buf长度是固定的 @see THREAD_MSG_BUG_LEN
// uint8_t len; //!< 这里不是buf的大小而是存储接收或者发送的长度 msg_tag_t tag; //!< 存放发送的临时标识
msg_tag_t tag;
} msg_buf_t; } msg_buf_t;
#define THREAD_MAIGC 0xdeadead //!< 用于栈溢出检测 #define THREAD_MAIGC 0xdeadead //!< 用于栈溢出检测
typedef struct thread typedef struct thread
{ {
kobject_t kobj; //!< 内核对象节点 kobject_t kobj; //!< 内核对象节点
// slist_head_t wait; //!< 用于等待队列
sched_t sche; //!< 调度节点 sched_t sche; //!< 调度节点
kobject_t *task; //!< 绑定的task kobject_t *task; //!< 绑定的task
sp_info_t sp; //!< sp信息 sp_info_t sp; //!< sp信息

View File

@@ -28,7 +28,6 @@ typedef struct ipc_wait_item
{ {
slist_head_t node; slist_head_t node;
thread_t *th; thread_t *th;
// ipc_t *ipc;
umword_t sleep_times; umword_t sleep_times;
} ipc_wait_item_t; } ipc_wait_item_t;
/** /**
@@ -38,12 +37,12 @@ typedef struct ipc_wait_item
typedef struct ipc typedef struct ipc
{ {
kobject_t kobj; //!< 内核对象 kobject_t kobj; //!< 内核对象
spinlock_t lock; //!< 操作的锁 TODO: 使用内核对象锁 spinlock_t lock; //!< 操作的锁
slist_head_t wait_send; //!< 发送等待队列 slist_head_t wait_send; //!< 发送等待队列
slist_head_t recv_send; //!< 接收等待队列 slist_head_t recv_send; //!< 接收等待队列
slist_head_t node; //!< 超时检查链表 slist_head_t node; //!< 超时检查链表
thread_t *svr_th; //!< 服务端 TODO:增加引用计数 thread_t *svr_th; //!< 服务端
thread_t *last_cli_th; //!< 上一次发送数据的客户端TODO:增加引用计数 thread_t *last_cli_th; //!< 上一次发送数据的客户端
ram_limit_t *lim; //!< 内存限额 ram_limit_t *lim; //!< 内存限额
umword_t user_id; //!< 服务端绑定的数据 umword_t user_id; //!< 服务端绑定的数据
} ipc_t; } ipc_t;

View File

@@ -141,11 +141,12 @@ void *mpu_ram_alloc(mm_space_t *ms, ram_limit_t *r_limit, size_t ram_size)
{ {
umword_t pre_alloc_addr; umword_t pre_alloc_addr;
struct mem_heap *heap = NULL; struct mem_heap *heap = NULL;
/*TODO:临界区保护*/ umword_t status = cpulock_lock();
again_alloc: again_alloc:
heap = mm_get_free(heap, ram_size, &pre_alloc_addr); heap = mm_get_free(heap, ram_size, &pre_alloc_addr);
if (!heap) if (!heap)
{ {
cpulock_set(status);
printk("The system is low on memory.\n"); printk("The system is low on memory.\n");
mm_trace(); mm_trace();
return NULL; return NULL;

View File

@@ -35,8 +35,8 @@ int main(int argc, char *args[])
mpu_test(); mpu_test();
ipc_test(); ipc_test();
thread_press_test(); thread_press_test();
#endif
kobj_create_press_test(); kobj_create_press_test();
#endif
uenv_t env = *u_get_global_env(); uenv_t env = *u_get_global_env();
obj_handler_t ipc_hd; obj_handler_t ipc_hd;
int ret = rpc_creaite_bind_ipc(THREAD_MAIN, NULL, &ipc_hd); int ret = rpc_creaite_bind_ipc(THREAD_MAIN, NULL, &ipc_hd);