forked from xuos/xiuos
				
			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