fix sys_arch to adapt kernel semaphore
This commit is contained in:
parent
a9309fa1b4
commit
60b1906396
|
@ -43,7 +43,7 @@ INC_DIR = -I$(KERNEL_ROOT)/services/shell/letter-shell \
|
||||||
-I$(KERNEL_ROOT)/services/app
|
-I$(KERNEL_ROOT)/services/app
|
||||||
|
|
||||||
ifeq ($(BOARD), imx6q-sabrelite)
|
ifeq ($(BOARD), imx6q-sabrelite)
|
||||||
all: init test_fault simple_client simple_server shell fs_server semaphore_server test_semaphore test_ipc_null test_thread test_irq_hdlr test_irq_block test_irq_send eth_driver epit_server readme.txt | bin
|
all: init test_fault simple_client simple_server shell fs_server semaphore_server test_semaphore test_ipc_null test_thread test_irq_hdlr test_irq_block test_irq_send eth_driver epit_server test_net lwip readme.txt | bin
|
||||||
else
|
else
|
||||||
all: init test_fault simple_client simple_server shell fs_server test_ipc_null test_thread test_semaphore readme.txt | bin
|
all: init test_fault simple_client simple_server shell fs_server test_ipc_null test_thread test_semaphore readme.txt | bin
|
||||||
endif
|
endif
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
|
|
||||||
static char udp_ip_str[128] = {0};
|
static char udp_ip_str[128] = {0};
|
||||||
static uint16_t udp_socket_port = 8888;
|
static uint16_t udp_socket_port = 8888;
|
||||||
#define UDP_DEMO_SEND_TIMES 20
|
#define UDP_DEMO_SEND_TIMES 3
|
||||||
|
|
||||||
int main(int argc, char* argv[])
|
int main(int argc, char* argv[])
|
||||||
{
|
{
|
||||||
|
|
|
@ -34,8 +34,6 @@
|
||||||
|
|
||||||
#define SYS_THREAD_MAX 4
|
#define SYS_THREAD_MAX 4
|
||||||
|
|
||||||
static char sem_server_name[] = "DefaultSemaphoreServer";
|
|
||||||
|
|
||||||
void sys_init(void)
|
void sys_init(void)
|
||||||
{
|
{
|
||||||
// do nothing
|
// do nothing
|
||||||
|
@ -65,9 +63,8 @@ void sys_arch_unprotect(sys_prot_t pval)
|
||||||
|
|
||||||
err_t sys_sem_new(sys_sem_t* sem, u8_t count)
|
err_t sys_sem_new(sys_sem_t* sem, u8_t count)
|
||||||
{
|
{
|
||||||
connect_session(&sem->sess, sem_server_name, 4096);
|
|
||||||
sem_create(&sem->sess, &sem->sem, (int)count);
|
|
||||||
|
|
||||||
|
*sem = semaphore_new(count);
|
||||||
#if SYS_STATS
|
#if SYS_STATS
|
||||||
++lwip_stats.sys.sem.used;
|
++lwip_stats.sys.sem.used;
|
||||||
if (lwip_stats.sys.sem.max < lwip_stats.sys.sem.used) {
|
if (lwip_stats.sys.sem.max < lwip_stats.sys.sem.used) {
|
||||||
|
@ -75,7 +72,7 @@ err_t sys_sem_new(sys_sem_t* sem, u8_t count)
|
||||||
}
|
}
|
||||||
#endif /* SYS_STATS */
|
#endif /* SYS_STATS */
|
||||||
|
|
||||||
if (sem->sem >= 0)
|
if (*sem > 0)
|
||||||
return ERR_OK;
|
return ERR_OK;
|
||||||
else {
|
else {
|
||||||
#if SYS_STATS
|
#if SYS_STATS
|
||||||
|
@ -91,36 +88,33 @@ void sys_sem_free(sys_sem_t* sem)
|
||||||
#if SYS_STATS
|
#if SYS_STATS
|
||||||
--lwip_stats.sys.sem.used;
|
--lwip_stats.sys.sem.used;
|
||||||
#endif /* SYS_STATS */
|
#endif /* SYS_STATS */
|
||||||
sem_delete(&sem->sess, &sem->sem);
|
semaphore_free(*sem);
|
||||||
free_session(&sem->sess);
|
|
||||||
free(sem);
|
|
||||||
sem = SYS_SEM_NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int sys_sem_valid(sys_sem_t* sem)
|
int sys_sem_valid(sys_sem_t* sem)
|
||||||
{
|
{
|
||||||
return (sem->sem >= 0);
|
return (*sem > 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void sys_sem_set_invalid(sys_sem_t* sem)
|
void sys_sem_set_invalid(sys_sem_t* sem)
|
||||||
{
|
{
|
||||||
sem->sem = -1;
|
*sem = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
u32_t sys_arch_sem_wait(sys_sem_t* sem, u32_t timeout)
|
u32_t sys_arch_sem_wait(sys_sem_t* sem, u32_t timeout)
|
||||||
{
|
{
|
||||||
s32_t wait_time = 0;
|
s32_t wait_time = 0;
|
||||||
|
|
||||||
if (sem->sem < 0)
|
if (*sem <= 0)
|
||||||
return SYS_ARCH_TIMEOUT;
|
return SYS_ARCH_TIMEOUT;
|
||||||
|
|
||||||
sem_wait(&sem->sess, &sem->sem, 0);
|
semaphore_wait(*sem);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void sys_sem_signal(sys_sem_t* sem)
|
void sys_sem_signal(sys_sem_t* sem)
|
||||||
{
|
{
|
||||||
sem_signal(&sem->sess, &sem->sem);
|
semaphore_signal(*sem);
|
||||||
}
|
}
|
||||||
|
|
||||||
err_t sys_mutex_new(sys_mutex_t* mutex)
|
err_t sys_mutex_new(sys_mutex_t* mutex)
|
||||||
|
@ -163,6 +157,7 @@ err_t sys_mbox_new(sys_mbox_t* mbox, int size)
|
||||||
sys_sem_new(&mbox->not_full, 0);
|
sys_sem_new(&mbox->not_full, 0);
|
||||||
sys_sem_new(&mbox->mutex, 1);
|
sys_sem_new(&mbox->mutex, 1);
|
||||||
mbox->wait_send = 0;
|
mbox->wait_send = 0;
|
||||||
|
mbox->valid = 1;
|
||||||
|
|
||||||
#if SYS_STATS
|
#if SYS_STATS
|
||||||
++lwip_stats.sys.mbox.used;
|
++lwip_stats.sys.mbox.used;
|
||||||
|
@ -181,23 +176,22 @@ err_t sys_mbox_new(sys_mbox_t* mbox, int size)
|
||||||
void sys_mbox_free(sys_mbox_t* mbox)
|
void sys_mbox_free(sys_mbox_t* mbox)
|
||||||
{
|
{
|
||||||
if (mbox != SYS_MBOX_NULL){
|
if (mbox != SYS_MBOX_NULL){
|
||||||
// sys_arch_sem_wait(&mbox->mutex, 0);
|
sys_arch_sem_wait(&mbox->mutex, 0);
|
||||||
// sys_sem_free(&mbox->not_empty);
|
sys_sem_free(&mbox->not_empty);
|
||||||
// sys_sem_free(&mbox->not_full);
|
sys_sem_free(&mbox->not_full);
|
||||||
// sys_sem_free(&mbox->mutex);
|
sys_sem_free(&mbox->mutex);
|
||||||
free(mbox);
|
free(mbox);
|
||||||
mbox = NULL;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int sys_mbox_valid(sys_mbox_t* mbox)
|
int sys_mbox_valid(sys_mbox_t* mbox)
|
||||||
{
|
{
|
||||||
return (mbox != SYS_MBOX_NULL);
|
return (mbox->valid == 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void sys_mbox_set_invalid(sys_mbox_t* mbox)
|
void sys_mbox_set_invalid(sys_mbox_t* mbox)
|
||||||
{
|
{
|
||||||
mbox = SYS_MBOX_NULL;
|
mbox->valid = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void sys_mbox_post(sys_mbox_t* q, void* msg)
|
void sys_mbox_post(sys_mbox_t* q, void* msg)
|
||||||
|
|
|
@ -39,22 +39,19 @@
|
||||||
#define SYS_MRTEX_NULL SYS_SEM_NULL
|
#define SYS_MRTEX_NULL SYS_SEM_NULL
|
||||||
#define SYS_MBOX_SIZE 128
|
#define SYS_MBOX_SIZE 128
|
||||||
|
|
||||||
struct sys_sem
|
|
||||||
{
|
typedef int sys_sem_t;
|
||||||
sem_t sem;
|
typedef int sys_mutex_t;
|
||||||
struct Session sess;
|
|
||||||
};
|
|
||||||
typedef struct sys_sem sys_sem_t;
|
|
||||||
typedef struct sys_sem sys_mutex_t;
|
|
||||||
|
|
||||||
|
|
||||||
struct sys_mbox{
|
struct sys_mbox{
|
||||||
int first, last;
|
int first, last;
|
||||||
void *msgs[SYS_MBOX_SIZE];
|
void *msgs[SYS_MBOX_SIZE];
|
||||||
struct sys_sem not_empty;
|
int not_empty;
|
||||||
struct sys_sem not_full;
|
int not_full;
|
||||||
struct sys_sem mutex;
|
int mutex;
|
||||||
int wait_send;
|
int wait_send;
|
||||||
|
int valid;
|
||||||
};
|
};
|
||||||
typedef struct sys_mbox sys_mbox_t;
|
typedef struct sys_mbox sys_mbox_t;
|
||||||
|
|
||||||
|
|
|
@ -35,10 +35,10 @@ static inline struct ksemaphore* ksemaphore_get_by_id(struct XiziSemaphorePool*
|
||||||
DOUBLE_LIST_FOR_EACH_ENTRY(sem, &sem_pool->sem_list_guard, sem_list_node)
|
DOUBLE_LIST_FOR_EACH_ENTRY(sem, &sem_pool->sem_list_guard, sem_list_node)
|
||||||
{
|
{
|
||||||
if (sem->id == sem_id) {
|
if (sem->id == sem_id) {
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return sem;
|
return sem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ksemaphore_alloc(struct XiziSemaphorePool* sem_pool, int val)
|
int ksemaphore_alloc(struct XiziSemaphorePool* sem_pool, int val)
|
||||||
|
@ -102,8 +102,9 @@ bool ksemaphore_signal(struct XiziSemaphorePool* sem_pool, uint32_t sem_id)
|
||||||
|
|
||||||
if (sem->val < 0) {
|
if (sem->val < 0) {
|
||||||
if (!IS_DOUBLE_LIST_EMPTY(&sem->wait_list_guard)) {
|
if (!IS_DOUBLE_LIST_EMPTY(&sem->wait_list_guard)) {
|
||||||
assert(sem->wait_list_guard.next != NULL);
|
struct Thread* thd = CONTAINER_OF(sem->wait_list_guard.next, struct Thread, node);
|
||||||
xizi_task_manager.task_unblock(CONTAINER_OF(sem->wait_list_guard.next, struct Thread, node));
|
assert(thd != NULL && thd->state == BLOCKED);
|
||||||
|
xizi_task_manager.task_unblock(thd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue