Skip to content

Commit 7aec293

Browse files
author
Rajmund Szymanski
committed
context switch is realized by functions setjmp / longjmp
1 parent 0a7b26b commit 7aec293

File tree

10 files changed

+222
-331
lines changed

10 files changed

+222
-331
lines changed

IntrOS/README

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ Features:
2626
- added _TSK_CREATE macro in os_tsk.h file
2727
- changed OS_DEF macro and added OS_NEW macro in os_tsk.h file
2828
- added changes in some definitions
29+
- context switch is realized by functions setjmp / longjmp
30+
- rebuilded kernel
2931
---------
3032
2.4
3133
- rebuilded internal preprocessor definitions

IntrOS/interface/inc/os_tsk.h

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,12 @@ struct __tsk
5151
fun_t * state; // inherited from timer
5252
unsigned start; // inherited from timer
5353
unsigned delay; // inherited from timer
54-
unsigned period;// inherited from timer
55-
56-
void * sp; // stack pointer
5754
void * top; // top of stack
55+
56+
union {
57+
jmp_buf buf; // setjmp/longjmp buffer
58+
ctx_t reg; // task context
59+
} ctx;
5860
};
5961

6062
typedef struct __tsk tsk_id[1];
@@ -76,7 +78,7 @@ typedef struct __tsk tsk_id[1];
7678
* *
7779
**********************************************************************************************************************/
7880

79-
#define _TSK_INIT( _state, _top ) { 0, 0, 0, 0, _state, 0, 0, 0, 0, _top }
81+
#define _TSK_INIT( _state, _top ) { 0, 0, 0, 0, _state, 0, 0, _top, { { 0 } } }
8082

8183
/**********************************************************************************************************************
8284
* *

IntrOS/interface/src/os_tsk.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
33
@file IntrOS: os_tsk.c
44
@author Rajmund Szymanski
5-
@date 14.01.2017
5+
@date 22.01.2017
66
@brief This file provides set of functions for IntrOS.
77
88
******************************************************************************
@@ -39,6 +39,7 @@ void tsk_start( tsk_t *tsk )
3939

4040
if (tsk->id == ID_STOPPED)
4141
{
42+
core_ctx_init(tsk);
4243
core_tsk_insert(tsk);
4344
}
4445

@@ -58,6 +59,7 @@ void tsk_startFrom( tsk_t *tsk, fun_t *state )
5859
{
5960
tsk->state = state;
6061

62+
core_ctx_init(tsk);
6163
core_tsk_insert(tsk);
6264
}
6365

@@ -91,6 +93,7 @@ void tsk_flip( fun_t *state )
9193

9294
Current->state = state;
9395

96+
core_ctx_init(Current);
9497
core_tsk_break();
9598
}
9699

IntrOS/kernel/ARMCC/oscore.c

Lines changed: 30 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
33
@file IntrOS: oscore.c
44
@author Rajmund Szymanski
5-
@date 27.10.2016
5+
@date 26.01.2017
66
@brief IntrOS port file for ARM Cotrex-M4F.
77
88
******************************************************************************
@@ -28,96 +28,50 @@
2828

2929
#if defined(__CC_ARM)
3030

31-
#include <stddef.h>
3231
#include <os.h>
3332

3433
/* -------------------------------------------------------------------------- */
3534

36-
__asm void core_ctx_switch( void )
35+
#if __FPU_USED
36+
37+
__asm int setjmp( jmp_buf buf )
3738
{
3839
PRESERVE8
39-
IMPORT System
40-
IMPORT core_tsk_handler
41-
EXPORT core_tsk_break
42-
43-
mrs r2, IPSR
44-
#if __CORTEX_M < 3
45-
cmp r2, #0
46-
bne priv_ctx_exit // inside ISR
47-
#else
48-
cbnz r2, priv_ctx_exit // inside ISR
49-
#endif
50-
mrs r3, PRIMASK
51-
#if __CORTEX_M < 3
52-
sub sp, #40
53-
mov r1, sp
54-
stm r1!, { r3 - r7 }
55-
mov r3, r8
56-
mov r4, r9
57-
mov r5, r10
58-
mov r6, r11
59-
mov r7, lr
60-
stm r1!, { r3 - r7 }
61-
#else
62-
push { r3 - r11, lr }
63-
#if __FPU_USED
64-
vpush { s16 - s31 }
65-
#endif
66-
#endif
67-
mov r1, sp
68-
69-
priv_tsk_save
70-
71-
ldr r0, =System
72-
ldr r0, [ r0, #__cpp(offsetof(sys_t, cur)) ]
73-
str r1, [ r0, #__cpp(offsetof(tsk_t, sp)) ]
74-
bl core_tsk_handler
75-
ldr r1, [ r0, #__cpp(offsetof(tsk_t, sp)) ]
76-
#if __CORTEX_M < 3
77-
cmp r1, #0
78-
beq priv_tsk_start
79-
#else
80-
cbz r1, priv_tsk_start
81-
#endif
82-
mov sp, r1
83-
#if __CORTEX_M < 3
84-
adds r1, #20
85-
ldm r1!, { r3 - r7 }
86-
mov r8, r3
87-
mov r9, r4
88-
mov r10, r5
89-
mov r11, r6
90-
mov lr, r7
91-
subs r1, #40
92-
ldm r1!, { r3 - r7 }
93-
add sp, #40
94-
#else
95-
#if __FPU_USED
96-
vpop { s16 - s31 }
97-
#endif
98-
pop { r3 - r11, lr }
99-
#endif
100-
msr PRIMASK, r3
10140

102-
priv_ctx_exit
41+
mov ip, sp
42+
stmia r0!, { r8-r11,lr }
43+
stmia r0!, { r4-r7,ip }
44+
vstmia r0!, { s16-s31 }
45+
movs r0, # 0
46+
bx lr
10347

104-
bx lr
48+
ALIGN
49+
}
50+
51+
#endif
52+
53+
/* -------------------------------------------------------------------------- */
10554

106-
priv_tsk_start
55+
#if __FPU_USED
10756

108-
ldr r1, [ r0, #__cpp(offsetof(tsk_t, top)) ]
109-
mov sp, r1
110-
ldr r3, [ r0, #__cpp(offsetof(tsk_t, state)) ]
111-
blx r3
112-
113-
core_tsk_break
57+
__asm void longjmp( jmp_buf buf, int val )
58+
{
59+
PRESERVE8
11460

115-
movs r1, #0
116-
b priv_tsk_save
61+
ldmia r0!, { r8-r11,lr }
62+
ldmia r0!, { r4-r7,ip }
63+
vldmia r0!, { s16-s31 }
64+
mov sp, ip
65+
movs r0, r1
66+
it eq
67+
moveq r0, # 1
68+
bx lr
11769

11870
ALIGN
11971
}
12072

73+
#endif
74+
12175
/* -------------------------------------------------------------------------- */
12276

12377
#endif // __CC_ARM

IntrOS/kernel/CLANG/oscore.c

Lines changed: 30 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
33
@file IntrOS: oscore.c
44
@author Rajmund Szymanski
5-
@date 27.10.2016
5+
@date 26.01.2017
66
@brief IntrOS port file for ARM Cotrex-M4F.
77
88
******************************************************************************
@@ -28,101 +28,50 @@
2828

2929
#if defined(__ARMCOMPILER_VERSION)
3030

31-
#include <stddef.h>
3231
#include <os.h>
3332

3433
/* -------------------------------------------------------------------------- */
3534

35+
#if __FPU_USED
36+
3637
__attribute__((naked))
37-
void core_ctx_switch( void )
38+
int setjmp(/*jmp_buf buf*/)
3839
{
3940
__asm volatile
4041
(
41-
" .global core_tsk_break \n"
42-
43-
" mrs r2, IPSR \n"
44-
#if __CORTEX_M < 3
45-
" cmp r2, #0 \n"
46-
" bne priv_ctx_exit \n"
47-
#else
48-
" cbnz r2, priv_ctx_exit \n"
49-
#endif
50-
" mrs r3, PRIMASK \n"
51-
#if __CORTEX_M < 3
52-
" sub sp, #40 \n"
53-
" mov r1, sp \n"
54-
" stm r1!, { r3 - r7 } \n"
55-
" mov r3, r8 \n"
56-
" mov r4, r9 \n"
57-
" mov r5, r10 \n"
58-
" mov r6, r11 \n"
59-
" mov r7, lr \n"
60-
" stm r1!, { r3 - r7 } \n"
61-
#else
62-
" push { r3 - r11, lr } \n"
63-
#if __FPU_USED
64-
" vpush { s16 - s31 } \n"
65-
#endif
66-
#endif
67-
" mov r1, sp \n"
68-
69-
"priv_tsk_save: \n"
70-
71-
" ldr r0, =System \n"
72-
" ldr r0, [ r0, %[cur] ] \n"
73-
" str r1, [ r0, %[sp] ] \n"
74-
" bl core_tsk_handler \n"
75-
" ldr r1, [ r0, %[sp] ] \n"
76-
#if __CORTEX_M < 3
77-
" cmp r1, #0 \n"
78-
" beq priv_tsk_start \n"
79-
#else
80-
" cbz r1, priv_tsk_start \n"
81-
#endif
82-
" mov sp, r1 \n"
83-
#if __CORTEX_M < 3
84-
" adds r1, #20 \n"
85-
" ldm r1!, { r3 - r7 } \n"
86-
" mov r8, r3 \n"
87-
" mov r9, r4 \n"
88-
" mov r10, r5 \n"
89-
" mov r11, r6 \n"
90-
" mov lr, r7 \n"
91-
" subs r1, #40 \n"
92-
" ldm r1!, { r3 - r7 } \n"
93-
" add sp, #40 \n"
94-
#else
95-
#if __FPU_USED
96-
" vpop { s16 - s31 } \n"
97-
#endif
98-
" pop { r3 - r11, lr } \n"
99-
#endif
100-
" msr PRIMASK, r3 \n"
101-
102-
"priv_ctx_exit: \n"
103-
104-
" bx lr \n"
42+
" mov ip, sp \n"
43+
" stmia r0!, { r8-r11,lr } \n"
44+
" stmia r0!, { r4-r7,ip } \n"
45+
" vstmia r0!, { s16-s31 } \n"
46+
" movs r0, # 0 \n"
47+
" bx lr \n"
48+
);
49+
}
10550

106-
"priv_tsk_start: \n"
51+
#endif
10752

108-
" ldr r1, [ r0, %[top] ] \n"
109-
" mov sp, r1 \n"
110-
" ldr r3, [ r0, %[state] ] \n"
111-
" blx r3 \n"
112-
113-
" .thumb_func \n"
114-
"core_tsk_break: \n"
53+
/* -------------------------------------------------------------------------- */
11554

116-
" movs r1, #0 \n"
117-
" b priv_tsk_save \n"
55+
#if __FPU_USED
11856

119-
:: [cur] "n" (offsetof(sys_t, cur)),
120-
[state] "n" (offsetof(tsk_t, state)),
121-
[sp] "n" (offsetof(tsk_t, sp)),
122-
[top] "n" (offsetof(tsk_t, top))
57+
__attribute__((naked))
58+
void longjmp(/*jmp_buf buf, int val*/)
59+
{
60+
__asm volatile
61+
(
62+
" ldmia r0!, { r8-r11,lr } \n"
63+
" ldmia r0!, { r4-r7,ip } \n"
64+
" vldmia r0!, { s16-s31 } \n"
65+
" mov sp, ip \n"
66+
" movs r0, r1 \n"
67+
" it eq \n"
68+
" moveq r0, # 1 \n"
69+
" bx lr \n"
12370
);
12471
}
12572

73+
#endif
74+
12675
/* -------------------------------------------------------------------------- */
12776

12877
#endif // __ARMCOMPILER_VERSION

0 commit comments

Comments
 (0)