Skip to content

Commit 02e1914

Browse files
committed
Semaphore starts to support multiple count limits.
1 parent 4d863ca commit 02e1914

File tree

11 files changed

+75
-166
lines changed

11 files changed

+75
-166
lines changed

build_version.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,11 @@
1212
extern "C" {
1313
#endif
1414

15-
#define ATOS_BUILD_TIME "2024-05-03,15:38"
16-
#define ATOS_COMMIT_HEAD_ID "89288f504ee15657abc039685265dec9f4f236be"
15+
#define ATOS_BUILD_TIME "2024-05-03,19:06"
16+
#define ATOS_COMMIT_HEAD_ID "4d863cac69b2f231fd7fc070f0956888261f741a"
1717
#define ATOS_VERSION_MAJOR_NUMBER (1u)
1818
#define ATOS_VERSION_MINOR_NUMBER (4u)
19-
#define ATOS_VERSION_PATCH_NUMBER (8u)
19+
#define ATOS_VERSION_PATCH_NUMBER (9u)
2020

2121
#define ATOS_VERSION_MAJOR_NUMBER_MASK (0x03FFu)
2222
#define ATOS_VERSION_MAJOR_NUMBER_POS (22u)

include/kernel/at_rtos.h

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -301,10 +301,8 @@ static inline u32_t os_timer_system_total_ms(void)
301301
/**
302302
* @brief Initialize a new semaphore.
303303
*
304-
* @param initial The initial count that allows the system take.
304+
* @param remain The initial count that allows the system take.
305305
* @param limit The maximum count that it's the semaphore's limitation.
306-
* @param permit TRUE flag permits that all sem_give counts save until sem_take flush, even if the counts number higher than limitation
307-
*setting count. FALSE flag can reduce useless thread wakeup calling.
308306
* @param pName The semaphore name.
309307
*
310308
* @return The semaphore unique id.
@@ -318,14 +316,14 @@ static inline u32_t os_timer_system_total_ms(void)
318316
* }
319317
* ...
320318
*/
321-
static inline os_sem_id_t os_sem_init(u8_t initial, u8_t limit, b_t permit, const char_t *pName)
319+
static inline os_sem_id_t os_sem_init(u8_t remain, u8_t limit, const char_t *pName)
322320
{
323-
u32_t _impl_semaphore_os_id_to_number(os_id_t id);
324-
os_id_t _impl_semaphore_init(u8_t initialCount, u8_t limitCount, b_t permit, const char_t *pName);
321+
extern u32_t _impl_semaphore_os_id_to_number(os_id_t id);
322+
extern os_id_t _impl_semaphore_init(u8_t remainCount, u8_t limitCount, const char_t *pName);
325323

326324
os_sem_id_t id = {0u};
327325

328-
id.val = _impl_semaphore_init(initial, limit, permit, pName);
326+
id.val = _impl_semaphore_init(remain, limit, pName);
329327
id.number = _impl_semaphore_os_id_to_number(id.val);
330328
id.pName = pName;
331329

@@ -973,7 +971,7 @@ typedef struct {
973971
u32p_t (*timer_busy)(os_timer_id_t);
974972
u32_t (*timer_system_total_ms)(void);
975973

976-
os_sem_id_t (*sem_init)(u8_t, u8_t, b_t, const char_t *);
974+
os_sem_id_t (*sem_init)(u8_t, u8_t, const char_t *);
977975
u32p_t (*sem_take)(os_sem_id_t, u32_t);
978976
u32p_t (*sem_give)(os_sem_id_t);
979977
u32p_t (*sem_flush)(os_sem_id_t);

include/kernel/kernel.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ u32_t kernel_schedule_time_get(void);
8181
u32_t kernel_thread_use_percent_take(os_id_t id);
8282
void kernel_privilege_call_inSVC_c(u32_t *svc_args);
8383
u32_t kernel_privilege_invoke(const void *pCallFun, arguments_t *pArgs);
84-
void kernel_semaphore_list_transfer_toLock(linker_head_t *pCurHead);
84+
void kernel_semaphore_list_transfer_toInit(linker_head_t *pCurHead);
8585
void kernel_schedule_thread(void);
8686
void kernel_idle_thread(void);
8787
void kthread_init(void);

include/kernel/kstruct.h

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,9 @@ typedef struct {
5858
/* A common struct head to link with other context */
5959
linker_head_t head;
6060

61-
u8_t initialCount;
61+
u8_t remains;
6262

63-
u8_t limitCount;
64-
65-
b_t isPermit;
63+
u8_t limits;
6664

6765
u32_t timeout_ms;
6866

@@ -259,14 +257,12 @@ enum {
259257
KERNEL_MEMBER_LIST_TIMER_PEND,
260258
KERNEL_MEMBER_LIST_TIMER_RUN,
261259

262-
KERNEL_MEMBER_LIST_SEMAPHORE_LOCK,
263-
KERNEL_MEMBER_LIST_SEMAPHORE_UNLOCK,
260+
KERNEL_MEMBER_LIST_SEMAPHORE_INIT,
264261

265262
KERNEL_MEMBER_LIST_MUTEX_LOCK,
266263
KERNEL_MEMBER_LIST_MUTEX_UNLOCK,
267264

268265
KERNEL_MEMBER_LIST_EVENT_INIT,
269-
KERNEL_MEMBER_LIST_EVENT_ACTIVE,
270266

271267
KERNEL_MEMBER_LIST_QUEUE_INIT,
272268

include/kernel/trace.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ typedef struct {
3636
typedef struct {
3737
u16_t initial_count;
3838
u16_t limit_count;
39-
b_t permit;
4039
u32_t timeout_ms;
4140
list_t wait_list;
4241
} semaphore_snapshot_t;

kernel/event.c

Lines changed: 1 addition & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -41,16 +41,6 @@ static list_t *_event_list_initHeadGet(void)
4141
return (list_t *)kernel_member_list_get(KERNEL_MEMBER_EVENT, KERNEL_MEMBER_LIST_EVENT_INIT);
4242
}
4343

44-
/**
45-
* @brief Get the active event list head.
46-
*
47-
* @return The value of the active list head.
48-
*/
49-
static list_t *_event_list_activeHeadGet(void)
50-
{
51-
return (list_t *)kernel_member_list_get(KERNEL_MEMBER_EVENT, KERNEL_MEMBER_LIST_EVENT_ACTIVE);
52-
}
53-
5444
/**
5545
* @brief Pick up a highest priority thread that blocking by the event pending list.
5646
*
@@ -80,21 +70,6 @@ static void _event_list_transfer_toInit(linker_head_t *pCurHead)
8070
EXIT_CRITICAL_SECTION();
8171
}
8272

83-
/**
84-
* @brief Push one event context into active list.
85-
*
86-
* @param pCurHead The pointer of the timer linker head.
87-
*/
88-
static void _event_list_transfer_toActive(linker_head_t *pCurHead)
89-
{
90-
ENTER_CRITICAL_SECTION();
91-
92-
list_t *pToActiveList = (list_t *)_event_list_activeHeadGet();
93-
linker_list_transaction_common(&pCurHead->linker, pToActiveList, LIST_TAIL);
94-
95-
EXIT_CRITICAL_SECTION();
96-
}
97-
9873
/**
9974
* @brief Check if the event unique id if is's invalid.
10075
*
@@ -535,7 +510,7 @@ b_t event_snapshot(u32_t instance, kernel_snapshot_t *pMsgs)
535510
return FALSE;
536511
}
537512

538-
if (pCurEvent->head.linker.pList == _event_list_activeHeadGet()) {
513+
if (pCurEvent->head.linker.pList == _event_list_initHeadGet()) {
539514
pMsgs->pState = "init";
540515
} else if (pCurEvent->head.linker.pList) {
541516
pMsgs->pState = "*";

kernel/kernel.c

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,9 @@ static kernel_member_setting_t g_kernel_member_setting[KERNEL_MEMBER_NUMBER] = {
3030
[KERNEL_MEMBER_THREAD] = {KERNEL_MEMBER_MAP_1, (SBITS(KERNEL_MEMBER_LIST_THREAD_WAIT, KERNEL_MEMBER_LIST_THREAD_EXIT))},
3131
[KERNEL_MEMBER_TIMER_INTERNAL] = {KERNEL_MEMBER_MAP_2, (SBITS(KERNEL_MEMBER_LIST_TIMER_STOP, KERNEL_MEMBER_LIST_TIMER_RUN))},
3232
[KERNEL_MEMBER_TIMER] = {KERNEL_MEMBER_MAP_3, (SBITS(KERNEL_MEMBER_LIST_TIMER_STOP, KERNEL_MEMBER_LIST_TIMER_RUN))},
33-
[KERNEL_MEMBER_SEMAPHORE] = {KERNEL_MEMBER_MAP_4, (SBITS(KERNEL_MEMBER_LIST_SEMAPHORE_LOCK, KERNEL_MEMBER_LIST_SEMAPHORE_UNLOCK))},
33+
[KERNEL_MEMBER_SEMAPHORE] = {KERNEL_MEMBER_MAP_4, (SBIT(KERNEL_MEMBER_LIST_SEMAPHORE_INIT))},
3434
[KERNEL_MEMBER_MUTEX] = {KERNEL_MEMBER_MAP_5, (SBITS(KERNEL_MEMBER_LIST_MUTEX_LOCK, KERNEL_MEMBER_LIST_MUTEX_UNLOCK))},
35-
[KERNEL_MEMBER_EVENT] = {KERNEL_MEMBER_MAP_6, (SBITS(KERNEL_MEMBER_LIST_EVENT_INIT, KERNEL_MEMBER_LIST_EVENT_ACTIVE))},
35+
[KERNEL_MEMBER_EVENT] = {KERNEL_MEMBER_MAP_6, (SBIT(KERNEL_MEMBER_LIST_EVENT_INIT))},
3636
[KERNEL_MEMBER_QUEUE] = {KERNEL_MEMBER_MAP_7, (SBIT(KERNEL_MEMBER_LIST_QUEUE_INIT))},
3737
[KERNEL_MEMBER_POOL] = {KERNEL_MEMBER_MAP_8, (SBIT(KERNEL_MEMBER_LIST_POOL_INIT))},
3838
};
@@ -348,6 +348,21 @@ u32_t kernel_schedule_time_get(void)
348348
return _kernel_pendsv_time_get();
349349
}
350350

351+
/**
352+
* @brief Push one semaphore context into lock list.
353+
*
354+
* @param pCurHead The pointer of the semaphore linker head.
355+
*/
356+
void kernel_semaphore_list_transfer_toInit(linker_head_t *pCurHead)
357+
{
358+
ENTER_CRITICAL_SECTION();
359+
360+
list_t *pToLockList = (list_t *)(list_t *)kernel_member_list_get(KERNEL_MEMBER_SEMAPHORE, KERNEL_MEMBER_LIST_SEMAPHORE_INIT);
361+
linker_list_transaction_common(&pCurHead->linker, pToLockList, LIST_TAIL);
362+
363+
EXIT_CRITICAL_SECTION();
364+
}
365+
351366
/**
352367
* @brief kernel thread use percent value take.
353368
*
@@ -729,21 +744,6 @@ void kernel_thread_list_transfer_toPend(linker_head_t *pCurHead)
729744
EXIT_CRITICAL_SECTION();
730745
}
731746

732-
/**
733-
* @brief Push one semaphore context into lock list.
734-
*
735-
* @param pCurHead The pointer of the semaphore linker head.
736-
*/
737-
void kernel_semaphore_list_transfer_toLock(linker_head_t *pCurHead)
738-
{
739-
ENTER_CRITICAL_SECTION();
740-
741-
list_t *pToLockList = (list_t *)(list_t *)kernel_member_list_get(KERNEL_MEMBER_SEMAPHORE, KERNEL_MEMBER_LIST_SEMAPHORE_LOCK);
742-
linker_list_transaction_common(&pCurHead->linker, pToLockList, LIST_TAIL);
743-
744-
EXIT_CRITICAL_SECTION();
745-
}
746-
747747
/**
748748
* @brief The thread is trying to exit into suspend.
749749
*

kernel/kthread.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -195,9 +195,8 @@ void kthread_init(void)
195195
.pName = g_kernel_thread_resource.schedule_id.pName,
196196
.linker = LINKER_NULL,
197197
},
198-
.initialCount = 0u,
199-
.limitCount = OS_SEMPHORE_TICKET_BINARY,
200-
.isPermit = FALSE, /* reduce useless thread calling */
198+
.remains = 0u,
199+
.limits = OS_SEMPHORE_TICKET_BINARY,
201200
},
202201
};
203202

@@ -208,7 +207,7 @@ void kthread_init(void)
208207

209208
pCurSemaphore =
210209
(semaphore_context_t *)kernel_member_unified_id_toContainerAddress(kernel_semaphore[KERNEL_SCHEDULE_SEMAPHORE_INSTANCE].head.id);
211-
kernel_semaphore_list_transfer_toLock((linker_head_t *)&pCurSemaphore->head);
210+
kernel_semaphore_list_transfer_toInit((linker_head_t *)&pCurSemaphore->head);
212211
}
213212

214213
#ifdef __cplusplus

0 commit comments

Comments
 (0)