Minor optimization and bug-fix from qizhenglin

it is OK
This commit is contained in:
xuedongliang 2025-01-13 16:45:54 +08:00
commit 3b133b4fe7
6 changed files with 41 additions and 17 deletions

1
Ubiquitous/XiZi_AIoT/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
build

View File

@ -140,3 +140,12 @@ distclean:
@rm -f .config* @rm -f .config*
@rm -f $(KERNEL_ROOT)/lib/musllib/libmusl.a @rm -f $(KERNEL_ROOT)/lib/musllib/libmusl.a
@rm -f $(KERNEL_ROOT)/board/*/.config @rm -f $(KERNEL_ROOT)/board/*/.config
# Run qemu with config discribed in README.md.
.PHONY: qemu-default
qemu-default:
qemu-system-arm -M sabrelite -m 1G -smp 4 -cpu cortex-a9 \
-display none -serial null -serial stdio \
-kernel ./build/XiZi-imx6q-sabrelite.elf

View File

@ -0,0 +1,3 @@
bin
fs.img
user.map

View File

@ -41,15 +41,28 @@ int IPC_DO_SERVE_FUNC(Ipc_sem_create)(sem_t* sem, int* count)
return SEMAPHORE_SUC; return SEMAPHORE_SUC;
} }
#define CHECK_SEM_RANGE(sem) \
do { \
if (*sem < 0 || *sem >= MAX_SUPPORT_SEMAPHORES) { \
return SEMAPHORE_ERR; \
} \
} while (0)
#define CHECK_SEM_RANGE_AND_VALID(sem) \
do { \
CHECK_SEM_RANGE(sem); \
\
if (!sem_pool[*sem].valid) { \
return SEMAPHORE_ERR; \
} \
} while (0)
int IPC_DO_SERVE_FUNC(Ipc_sem_delete)(sem_t* sem) int IPC_DO_SERVE_FUNC(Ipc_sem_delete)(sem_t* sem)
{ {
if (*sem < 0 || *sem > MAX_SUPPORT_SEMAPHORES) { CHECK_SEM_RANGE_AND_VALID(sem);
return SEMAPHORE_ERR;
}
if (!sem_pool[*sem].valid) {
return SEMAPHORE_ERR;
}
sem_pool[*sem].valid = false; sem_pool[*sem].valid = false;
return SEMAPHORE_SUC; return SEMAPHORE_SUC;
@ -57,9 +70,7 @@ int IPC_DO_SERVE_FUNC(Ipc_sem_delete)(sem_t* sem)
int IPC_DO_SERVE_FUNC(Ipc_sem_wait)(sem_t* sem, int* timeout) int IPC_DO_SERVE_FUNC(Ipc_sem_wait)(sem_t* sem, int* timeout)
{ {
if (*sem < 0 || *sem > MAX_SUPPORT_SEMAPHORES) { CHECK_SEM_RANGE(sem);
return SEMAPHORE_ERR;
}
/// @todo support timeout /// @todo support timeout
// return if sem is freed(no valid) or sem count is sufficient // return if sem is freed(no valid) or sem count is sufficient
@ -72,13 +83,7 @@ int IPC_DO_SERVE_FUNC(Ipc_sem_wait)(sem_t* sem, int* timeout)
int IPC_DO_SERVE_FUNC(Ipc_sem_signal)(sem_t* sem) int IPC_DO_SERVE_FUNC(Ipc_sem_signal)(sem_t* sem)
{ {
if (*sem < 0 || *sem >= MAX_SUPPORT_SEMAPHORES) { CHECK_SEM_RANGE_AND_VALID(sem);
return SEMAPHORE_ERR;
}
if (!sem_pool[*sem].valid) {
return SEMAPHORE_ERR;
}
sem_pool[*sem].count++; sem_pool[*sem].count++;
return SEMAPHORE_SUC; return SEMAPHORE_SUC;

View File

@ -0,0 +1 @@
mkfs

View File

@ -77,8 +77,13 @@ static struct KPage* KBuddyPagesAlloc(struct KBuddy* pbuddy, int nPages)
int i = 0, order = 0; int i = 0, order = 0;
// find order // find order
#if defined(__GNUC__)
// see: https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html
order = nPages ? (sizeof(int) * 8 - __builtin_clz(nPages) - 1) + !!(__builtin_popcount(nPages) != 1) : 0;
#else
for (order = 0; (FREE_LIST_INDEX(order)) < nPages; order++) for (order = 0; (FREE_LIST_INDEX(order)) < nPages; order++)
; ;
#endif
// find the free page list // find the free page list
for (i = order; i < MAX_BUDDY_ORDER; i++) { for (i = order; i < MAX_BUDDY_ORDER; i++) {