修复mpu内存分配的临界保护问题
This commit is contained in:
@@ -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(
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|
||||||
|
|||||||
@@ -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信息
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user