Skip to content

Commit 5216a3b

Browse files
committed
Add thread entry function argument.
1 parent d85c041 commit 5216a3b

File tree

12 files changed

+61
-49
lines changed

12 files changed

+61
-49
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 "2025-02-04,15:10"
16-
#define ATOS_COMMIT_HEAD_ID "a0b28787448a43985e85829c0426dfec46eb8f0f"
15+
#define ATOS_BUILD_TIME "2025-02-04,16:26"
16+
#define ATOS_COMMIT_HEAD_ID "d85c041e0b12e7bc1bfd22e05f570788e579dc7f"
1717
#define ATOS_VERSION_MAJOR_NUMBER (2u)
1818
#define ATOS_VERSION_MINOR_NUMBER (0u)
19-
#define ATOS_VERSION_PATCH_NUMBER (12u)
19+
#define ATOS_VERSION_PATCH_NUMBER (13u)
2020

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

include/at_rtos.h

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -100,17 +100,19 @@ struct foreach_item {
100100
* @param pStackAddr The pointer of the thread stack address. The stack memory must be predefined and allocated in your system.
101101
* @param stackSize The size of the the stack is base on your specified variable.
102102
* @param priority The thread priority specified the thread's priority when the AtOS do kernel schedule.
103+
* @param pArg The thread entry function argument.
103104
* @param pName The thread name.
104105
*
105106
* @return The value of thread unique id.
106107
*/
107-
static inline os_thread_id_t os_thread_init(u32_t *pStackAddr, u32_t size, i16_t priority, pThread_entryFunc_t pEntryFun,
108+
static inline os_thread_id_t os_thread_init(u32_t *pStackAddr, u32_t size, i16_t priority, pThread_entryFunc_t pEntryFun, void *pArg,
108109
const char_t *pName)
109110
{
110-
extern u32_t _impl_thread_init(pThread_entryFunc_t pEntryFun, u32_t * pAddress, u32_t size, i16_t priority, const char_t *pName);
111+
extern _u32_t _impl_thread_init(pThread_entryFunc_t pEntryFun, _u32_t * pAddress, _u32_t size, _i16_t priority, void *pArg,
112+
const _char_t *pName);
111113

112114
os_thread_id_t id = {0u};
113-
id.u32_val = _impl_thread_init(pEntryFun, pStackAddr, size, priority, pName);
115+
id.u32_val = _impl_thread_init(pEntryFun, pStackAddr, size, priority, pArg, pName);
114116
id.pName = pName;
115117

116118
return id;
@@ -898,7 +900,7 @@ static inline void os_object_free_force(struct os_id id)
898900
/* It defined the AtOS extern symbol for convenience use, but it has extra memory consumption */
899901
#ifdef OS_API_ENABLED
900902
typedef struct {
901-
os_thread_id_t (*thread_init)(u32_t *, u32_t, i16_t, pThread_entryFunc_t, const char_t *);
903+
os_thread_id_t (*thread_init)(u32_t *, u32_t, i16_t, pThread_entryFunc_t, void *, const char_t *);
902904
i32p_t (*thread_sleep)(u32_t);
903905
i32p_t (*thread_resume)(os_thread_id_t);
904906
i32p_t (*thread_suspend)(os_thread_id_t);

include/kernel.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,15 +46,15 @@ void schedule_setPend(struct schedule_task *pTask);
4646
list_t *schedule_waitList(void);
4747
_b_t schedule_hasTwoPendingItem(void);
4848
_i32p_t kernel_schedule_result_take(void);
49-
_u32_t kernel_stack_frame_init(void (*pEntryFunction)(void), _u32_t *pAddress, _u32_t size);
49+
_u32_t kernel_stack_frame_init(void (*pEntryFn)(void *), _u32_t *pAddress, _u32_t size, void *p_arg);
5050
_b_t kernel_isInThreadMode(void);
5151
_i32p_t kernel_thread_schedule_request(void);
5252
void kernel_message_notification(void);
5353
void kernel_scheduler_inPendSV_c(_u32_t **ppCurPsp, _u32_t **ppNextPSP);
5454
void kernel_privilege_call_inSVC_c(_u32_t *svc_args);
5555
_i32p_t kernel_privilege_invoke(const void *pCallFun, arguments_t *pArgs);
56-
void kernel_schedule_thread(void);
57-
void kernel_idle_thread(void);
56+
void kernel_schedule_thread(void *p_arg);
57+
void kernel_idle_thread(void *p_arg);
5858
void kthread_message_notification(void);
5959
_i32p_t kthread_message_arrived(void);
6060
void kthread_message_idle_loop_fn(void);

include/kstruct.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
typedef void (*pCallbackFunc_t)(void);
2626
typedef void (*pTimer_callbackFunc_t)(void *);
2727
typedef void (*pTask_callbackFunc_t)(void *);
28-
typedef void (*pThread_entryFunc_t)(void);
28+
typedef void (*pThread_entryFunc_t)(void *);
2929
typedef void (*pEvent_callbackFunc_t)(void);
3030
typedef void (*pSubscribe_callbackFunc_t)(const void *, _u16_t);
3131
typedef void (*pTimeout_callbackFunc_t)(void *);
@@ -269,7 +269,8 @@ struct thread_context {
269269
typedef struct thread_context thread_context_t;
270270

271271
typedef struct {
272-
struct thread_context *pThread;
272+
struct thread_context *p_thread;
273+
void *p_arg;
273274
} thread_context_init_t;
274275

275276
/** @brief The rtos kernel structure. */

include/port/port.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,7 @@ _u32_t port_irq_disable(void);
312312
void port_irq_enable(_u32_t value);
313313
void port_setPendSV(void);
314314
void port_interrupt_init(void);
315-
_u32_t port_stack_frame_init(void (*pEntryFunction)(void), _u32_t *pAddress, _u32_t size);
315+
_u32_t port_stack_frame_init(void (*pEntryFn)(void*), _u32_t *pAddress, _u32_t size, void *pArg);
316316
_u32_t port_stack_free_size_get(_u32_t stack_addr);
317317

318318
#endif /* _PORT_H_ */

include/static_init.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@
7373
#define INIT_OS_THREAD_RUNTIME_NUM_DEFINE(num) \
7474
INIT_USED thread_context_t _init_runtime_thread[num] INIT_SECTION(_INIT_OS_THREAD_LIST) = {0}
7575

76-
#define INIT_OS_THREAD_DEFINE(id_name, priority, stack_size, pEntryFn) \
76+
#define INIT_OS_THREAD_DEFINE(id_name, priority, stack_size, pEntryFn, pArg) \
7777
STACK_STATIC_VALUE_DEFINE(id_name##_stack, stack_size); \
7878
INIT_USED thread_context_t _init_##id_name##_thread INIT_SECTION(_INIT_OS_THREAD_LIST) = \
7979
{.head = {.cs = CS_INITED, .pName = #id_name}, \
@@ -82,7 +82,7 @@
8282
.pEntryFunc = pEntryFn, \
8383
.task = {.prior = priority, .psp = 0u}}; \
8484
INIT_USED thread_context_init_t _init_##id_name##_thread_init INIT_SECTION(_INIT_OS_THREAD_STATIC) = \
85-
{.pThread = &_init_##id_name##_thread}; \
85+
{.p_thread = &_init_##id_name##_thread, .p_arg = pArg}; \
8686
os_thread_id_t id_name = {.p_val = (void*)&_init_##id_name##_thread, .pName = #id_name}
8787

8888
#define INIT_OS_TIMER_RUNTIME_NUM_DEFINE(num) \
@@ -188,7 +188,7 @@ extern void subscribe_notification(void *pLinker);
188188
#define INIT_OS_THREAD_RUNTIME_NUM_DEFINE(num) \
189189
static __root thread_context_t _init_runtime_thread[num] @ "_INIT_OS_THREAD_LIST" = {0}
190190

191-
#define INIT_OS_THREAD_DEFINE(id_name, priority, stack_size, pEntryFn) \
191+
#define INIT_OS_THREAD_DEFINE(id_name, priority, stack_size, pEntryFn, pArg) \
192192
STACK_STATIC_VALUE_DEFINE(id_name##_stack, stack_size); \
193193
static __root thread_context_t _init_##id_name##_thread @ "_INIT_OS_THREAD_LIST" = \
194194
{.head = {.cs = CS_INITED, .pName = #id_name}, \
@@ -197,7 +197,7 @@ extern void subscribe_notification(void *pLinker);
197197
.pEntryFunc = pEntryFn, \
198198
.task = {.prior = priority, .psp = 0u}}; \
199199
static __root thread_context_init_t _init_##id_name##_thread_init @ "_INIT_OS_THREAD_STATIC" = \
200-
{.pThread = &_init_##id_name##_thread}; \
200+
{.p_thread = &_init_##id_name##_thread, .p_arg = pArg}; \
201201
os_thread_id_t id_name = {.p_val = (void*)&_init_##id_name##_thread, .pName = #id_name}
202202

203203
#define INIT_OS_TIMER_RUNTIME_NUM_DEFINE(num) \

package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "At-RTOS",
33
"homepage": "https://github.com/At-EC/At-RTOS",
4-
"version": "2.0.12",
5-
"timestamp": "2025-02-04,15:10",
6-
"commit_id": "e67d6b6d5955a438a676872675d7cbc0cbb5df19"
4+
"version": "2.0.13",
5+
"timestamp": "2025-02-04,16:26",
6+
"commit_id": "a0b28787448a43985e85829c0426dfec46eb8f0f"
77
}

source/kernel.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -374,9 +374,9 @@ static _i32p_t _kernel_message_arrived(void)
374374
*
375375
* @return The PSP stack address.
376376
*/
377-
_u32_t kernel_stack_frame_init(void (*pEntryFunction)(void), _u32_t *pAddress, _u32_t size)
377+
_u32_t kernel_stack_frame_init(void (*pEntryFn)(void*), _u32_t *pAddress, _u32_t size, void *p_arg)
378378
{
379-
return (_u32_t)port_stack_frame_init(pEntryFunction, pAddress, size);
379+
return (_u32_t)port_stack_frame_init(pEntryFn, pAddress, size, p_arg);
380380
}
381381

382382
/**
@@ -442,7 +442,7 @@ void kernel_message_notification(void)
442442
/**
443443
* @brief The kernel thread only serve for RTOS with highest priority.
444444
*/
445-
void kernel_schedule_thread(void)
445+
void kernel_schedule_thread(void* p_arg)
446446
{
447447
while (1) {
448448
PC_IF(_kernel_message_arrived(), PC_PASS)
@@ -458,7 +458,7 @@ void kernel_schedule_thread(void)
458458
/**
459459
* @brief The idle thread entry function.
460460
*/
461-
void kernel_idle_thread(void)
461+
void kernel_idle_thread(void* p_arg)
462462
{
463463
while (1) {
464464
kthread_message_idle_loop_fn();

source/kthread.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ INIT_OS_POOL_RUNTIME_NUM_DEFINE(POOL_RUNTIME_NUMBER_SUPPORTED);
1919
INIT_OS_PUBLISH_RUNTIME_NUM_DEFINE(PUBLISH_RUNTIME_NUMBER_SUPPORTED);
2020
INIT_OS_SUBSCRIBE_RUNTIME_NUM_DEFINE(SUBSCRIBE_RUNTIME_NUMBER_SUPPORTED);
2121

22-
INIT_OS_THREAD_DEFINE(kernel_th, OS_PRIORITY_KERNEL_SCHEDULE_LEVEL, KERNEL_SCHEDULE_THREAD_STACK_SIZE, kernel_schedule_thread);
23-
INIT_OS_THREAD_DEFINE(idle_th, OS_PRIORITY_KERNEL_IDLE_LEVEL, KERNEL_IDLE_THREAD_STACK_SIZE, kernel_idle_thread);
22+
INIT_OS_THREAD_DEFINE(kernel_th, OS_PRIORITY_KERNEL_SCHEDULE_LEVEL, KERNEL_SCHEDULE_THREAD_STACK_SIZE, kernel_schedule_thread, NULL);
23+
INIT_OS_THREAD_DEFINE(idle_th, OS_PRIORITY_KERNEL_IDLE_LEVEL, KERNEL_IDLE_THREAD_STACK_SIZE, kernel_idle_thread, NULL);
2424
INIT_OS_SEMAPHORE_DEFINE(kernel_sem, 0u, OS_SEM_LIMIT_BINARY);
2525

2626
static pThread_entryFunc_t g_idle_thread_user_entry_fn = NULL;
@@ -121,7 +121,7 @@ _i32p_t kthread_message_arrived(void)
121121
void kthread_message_idle_loop_fn(void)
122122
{
123123
if (g_idle_thread_user_entry_fn) {
124-
g_idle_thread_user_entry_fn();
124+
g_idle_thread_user_entry_fn(NULL);
125125
}
126126
}
127127

source/port/port_common.c

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -84,29 +84,32 @@ void port_interrupt_init(void)
8484
/**
8585
* @brief Initialize a thread stack frame.
8686
*
87-
* @param pEntryFunction The entry function pointer.
87+
* @param pEntryFn The entry function pointer.
8888
* @param pAddress The stack address.
8989
* @param size The stack size.
9090
*
9191
* @return The PSP stack address.
9292
*/
93-
_u32_t port_stack_frame_init(void (*pEntryFunction)(void), _u32_t *pAddress, _u32_t size)
93+
_u32_t port_stack_frame_init(void (*pEntryFn)(void *), _u32_t *pAddress, _u32_t size, void *pArg)
9494
{
95+
extern void _impl_thread_entry(void (*pEntryFn)(void *), void *pArg);
96+
9597
os_memset((_uchar_t *)pAddress, STACT_UNUSED_DATA, size);
9698

9799
_u32_t psp_frame = (_u32_t)pAddress + size - sizeof(stack_snapshot_t);
98100

99101
psp_frame = STACK_ADDRESS_DOWN(psp_frame);
100102

101-
((stack_snapshot_t *)psp_frame)->xPSR = B(24); /* xPSR */
102-
((stack_snapshot_t *)psp_frame)->R15_PC = (_u32_t)pEntryFunction; /* PC */
103-
((stack_snapshot_t *)psp_frame)->R14_LR = 0xFFFFFFFDu; /* LR */
103+
((stack_snapshot_t *)psp_frame)->xPSR = B(24); /* xPSR */
104+
((stack_snapshot_t *)psp_frame)->R15_PC = (_u32_t)_impl_thread_entry; /* PC */
105+
((stack_snapshot_t *)psp_frame)->R15_PC &= 0xFFFFFFFEu; /* ARM mode: Clear LSB of address */
106+
((stack_snapshot_t *)psp_frame)->R14_LR = 0xFFFFFFFDu; /* LR */
104107

105-
((stack_snapshot_t *)psp_frame)->R12 = 0x12121212u; /* R12 */
106-
((stack_snapshot_t *)psp_frame)->R3 = 0x03030303u; /* R3 */
107-
((stack_snapshot_t *)psp_frame)->R2 = 0x02020202u; /* R2 */
108-
((stack_snapshot_t *)psp_frame)->R1 = 0x01010101u; /* R1 */
109-
((stack_snapshot_t *)psp_frame)->R0 = 0x0B0B0B0Bu; /* R0 */
108+
((stack_snapshot_t *)psp_frame)->R12 = 0x12121212u; /* R12 */
109+
((stack_snapshot_t *)psp_frame)->R3 = 0x03030303u; /* R3 */
110+
((stack_snapshot_t *)psp_frame)->R2 = 0x02020202u; /* R2 */
111+
((stack_snapshot_t *)psp_frame)->R1 = (_u32_t)pArg; /* R1 */
112+
((stack_snapshot_t *)psp_frame)->R0 = (_u32_t)pEntryFn; /* R0 */
110113

111114
#if defined(ARCH_ARM_CORTEX_CM0)
112115
((stack_snapshot_t *)psp_frame)->cm0.R11 = 0x11111111u; /* R11 */
@@ -154,7 +157,7 @@ _u32_t port_stack_free_size_get(_u32_t stack_addr)
154157
return 0u;
155158
}
156159

157-
uint8_t *ptr = (uint8_t *)stack_addr;
160+
_u8_t *ptr = (_u8_t *)stack_addr;
158161
while (*ptr == STACT_UNUSED_DATA) {
159162
ptr++;
160163
}

0 commit comments

Comments
 (0)