Skip to content

Commit 854d014

Browse files
authored
Merge pull request #2665 from jesven/new_signal_fix
fix signal code
2 parents b41ac95 + 8dd2a07 commit 854d014

File tree

11 files changed

+384
-280
lines changed

11 files changed

+384
-280
lines changed

bsp/k210/.config

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
# RT-Thread Kernel
88
#
99
CONFIG_RT_NAME_MAX=8
10+
# CONFIG_RT_USING_ARCH_DATA_TYPE is not set
1011
CONFIG_RT_USING_SMP=y
1112
CONFIG_RT_CPUS_NR=2
1213
CONFIG_RT_ALIGN_SIZE=8
@@ -19,7 +20,7 @@ CONFIG_RT_USING_OVERFLOW_CHECK=y
1920
CONFIG_RT_USING_HOOK=y
2021
CONFIG_RT_USING_IDLE_HOOK=y
2122
CONFIG_RT_IDEL_HOOK_LIST_SIZE=4
22-
CONFIG_IDLE_THREAD_STACK_SIZE=1024
23+
CONFIG_IDLE_THREAD_STACK_SIZE=4096
2324
# CONFIG_RT_USING_TIMER_SOFT is not set
2425
CONFIG_RT_DEBUG=y
2526
CONFIG_RT_DEBUG_COLOR=y
@@ -43,7 +44,7 @@ CONFIG_RT_USING_MUTEX=y
4344
CONFIG_RT_USING_EVENT=y
4445
CONFIG_RT_USING_MAILBOX=y
4546
CONFIG_RT_USING_MESSAGEQUEUE=y
46-
# CONFIG_RT_USING_SIGNALS is not set
47+
CONFIG_RT_USING_SIGNALS=y
4748

4849
#
4950
# Memory Management
@@ -139,6 +140,7 @@ CONFIG_RT_USING_DFS_DEVFS=y
139140
#
140141
CONFIG_RT_USING_DEVICE_IPC=y
141142
CONFIG_RT_PIPE_BUFSZ=512
143+
# CONFIG_RT_USING_SYSTEM_WORKQUEUE is not set
142144
CONFIG_RT_USING_SERIAL=y
143145
CONFIG_RT_SERIAL_USING_DMA=y
144146
CONFIG_RT_SERIAL_RB_BUFSZ=64
@@ -202,6 +204,11 @@ CONFIG_RT_USING_POSIX=y
202204
#
203205
# CONFIG_RT_USING_SAL is not set
204206

207+
#
208+
# Network interface device
209+
#
210+
# CONFIG_RT_USING_NETDEV is not set
211+
205212
#
206213
# light weight TCP/IP stack
207214
#
@@ -225,7 +232,6 @@ CONFIG_RT_USING_POSIX=y
225232
#
226233
# Utilities
227234
#
228-
# CONFIG_RT_USING_LOGTRACE is not set
229235
# CONFIG_RT_USING_RYM is not set
230236
# CONFIG_RT_USING_ULOG is not set
231237
# CONFIG_RT_USING_UTEST is not set
@@ -354,7 +360,6 @@ CONFIG_RT_USING_POSIX=y
354360
# CONFIG_PKG_USING_MPU6XXX is not set
355361
# CONFIG_PKG_USING_PCF8574 is not set
356362
# CONFIG_PKG_USING_SX12XX is not set
357-
# CONFIG_PKG_USING_SIGNAL_LED is not set
358363
CONFIG_PKG_USING_KENDRYTE_SDK=y
359364
CONFIG_PKG_KENDRYTE_SDK_PATH="/packages/peripherals/kendryte-sdk"
360365
CONFIG_PKG_USING_KENDRYTE_SDK_V052=y
@@ -385,6 +390,34 @@ CONFIG_PKG_KENDRYTE_SDK_VER="v0.5.2"
385390
# CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set
386391
# CONFIG_PKG_USING_HELLO is not set
387392
# CONFIG_PKG_USING_VI is not set
393+
394+
#
395+
# Privated Packages of RealThread
396+
#
397+
# CONFIG_PKG_USING_CODEC is not set
398+
# CONFIG_PKG_USING_PLAYER is not set
399+
# CONFIG_PKG_USING_MPLAYER is not set
400+
# CONFIG_PKG_USING_PERSIMMON_SRC is not set
401+
# CONFIG_PKG_USING_JS_PERSIMMON is not set
402+
# CONFIG_PKG_USING_JERRYSCRIPT_WIN32 is not set
403+
404+
#
405+
# Network Utilities
406+
#
407+
# CONFIG_PKG_USING_WICED is not set
408+
# CONFIG_PKG_USING_CLOUDSDK is not set
409+
# CONFIG_PKG_USING_COREMARK is not set
410+
# CONFIG_PKG_USING_POWER_MANAGER is not set
411+
# CONFIG_PKG_USING_RT_OTA is not set
412+
# CONFIG_PKG_USING_RDBD_SRC is not set
413+
# CONFIG_PKG_USING_RTINSIGHT is not set
414+
# CONFIG_PKG_USING_SMARTCONFIG is not set
415+
# CONFIG_PKG_USING_RTX is not set
416+
# CONFIG_RT_USING_TESTCASE is not set
417+
# CONFIG_PKG_USING_NGHTTP2 is not set
418+
# CONFIG_PKG_USING_AVS is not set
419+
# CONFIG_PKG_USING_STS is not set
420+
# CONFIG_PKG_USING_DLMS is not set
388421
CONFIG_BOARD_K210_EVB=y
389422
CONFIG_BSP_USING_UART_HS=y
390423
# CONFIG_BSP_USING_UART1 is not set

bsp/k210/rtconfig.h

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
/* RT-Thread Kernel */
88

99
#define RT_NAME_MAX 8
10+
/* RT_USING_ARCH_DATA_TYPE is not set */
1011
#define RT_USING_SMP
1112
#define RT_CPUS_NR 2
1213
#define RT_ALIGN_SIZE 8
@@ -19,7 +20,7 @@
1920
#define RT_USING_HOOK
2021
#define RT_USING_IDLE_HOOK
2122
#define RT_IDEL_HOOK_LIST_SIZE 4
22-
#define IDLE_THREAD_STACK_SIZE 1024
23+
#define IDLE_THREAD_STACK_SIZE 4096
2324
/* RT_USING_TIMER_SOFT is not set */
2425
#define RT_DEBUG
2526
#define RT_DEBUG_COLOR
@@ -42,7 +43,7 @@
4243
#define RT_USING_EVENT
4344
#define RT_USING_MAILBOX
4445
#define RT_USING_MESSAGEQUEUE
45-
/* RT_USING_SIGNALS is not set */
46+
#define RT_USING_SIGNALS
4647

4748
/* Memory Management */
4849

@@ -130,6 +131,7 @@
130131

131132
#define RT_USING_DEVICE_IPC
132133
#define RT_PIPE_BUFSZ 512
134+
/* RT_USING_SYSTEM_WORKQUEUE is not set */
133135
#define RT_USING_SERIAL
134136
#define RT_SERIAL_USING_DMA
135137
#define RT_SERIAL_RB_BUFSZ 64
@@ -187,6 +189,10 @@
187189

188190
/* RT_USING_SAL is not set */
189191

192+
/* Network interface device */
193+
194+
/* RT_USING_NETDEV is not set */
195+
190196
/* light weight TCP/IP stack */
191197

192198
/* RT_USING_LWIP is not set */
@@ -205,7 +211,6 @@
205211

206212
/* Utilities */
207213

208-
/* RT_USING_LOGTRACE is not set */
209214
/* RT_USING_RYM is not set */
210215
/* RT_USING_ULOG is not set */
211216
/* RT_USING_UTEST is not set */
@@ -318,7 +323,6 @@
318323
/* PKG_USING_MPU6XXX is not set */
319324
/* PKG_USING_PCF8574 is not set */
320325
/* PKG_USING_SX12XX is not set */
321-
/* PKG_USING_SIGNAL_LED is not set */
322326
#define PKG_USING_KENDRYTE_SDK
323327
#define PKG_USING_KENDRYTE_SDK_V052
324328
/* PKG_USING_KENDRYTE_SDK_LATEST_VERSION is not set */
@@ -345,6 +349,32 @@
345349
/* PKG_USING_PERIPHERAL_SAMPLES is not set */
346350
/* PKG_USING_HELLO is not set */
347351
/* PKG_USING_VI is not set */
352+
353+
/* Privated Packages of RealThread */
354+
355+
/* PKG_USING_CODEC is not set */
356+
/* PKG_USING_PLAYER is not set */
357+
/* PKG_USING_MPLAYER is not set */
358+
/* PKG_USING_PERSIMMON_SRC is not set */
359+
/* PKG_USING_JS_PERSIMMON is not set */
360+
/* PKG_USING_JERRYSCRIPT_WIN32 is not set */
361+
362+
/* Network Utilities */
363+
364+
/* PKG_USING_WICED is not set */
365+
/* PKG_USING_CLOUDSDK is not set */
366+
/* PKG_USING_COREMARK is not set */
367+
/* PKG_USING_POWER_MANAGER is not set */
368+
/* PKG_USING_RT_OTA is not set */
369+
/* PKG_USING_RDBD_SRC is not set */
370+
/* PKG_USING_RTINSIGHT is not set */
371+
/* PKG_USING_SMARTCONFIG is not set */
372+
/* PKG_USING_RTX is not set */
373+
/* RT_USING_TESTCASE is not set */
374+
/* PKG_USING_NGHTTP2 is not set */
375+
/* PKG_USING_AVS is not set */
376+
/* PKG_USING_STS is not set */
377+
/* PKG_USING_DLMS is not set */
348378
#define BOARD_K210_EVB
349379
#define BSP_USING_UART_HS
350380
/* BSP_USING_UART1 is not set */

bsp/k210/rtconfig.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515

1616
if CROSS_TOOL == 'gcc':
1717
PLATFORM = 'gcc'
18-
EXEC_PATH = r'/opt/riscv64-unknown-elf/bin'
18+
EXEC_PATH = r'/opt/gnu-mcu-eclipse/riscv-none-gcc/8.2.0-2.1-20190425-1021/bin'
1919
else:
2020
print('Please make sure your toolchains is GNU GCC!')
2121
exit(0)

include/rtdef.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -492,9 +492,10 @@ typedef siginfo_t rt_siginfo_t;
492492
#define RT_THREAD_CLOSE 0x04 /**< Closed status */
493493
#define RT_THREAD_STAT_MASK 0x0f
494494

495-
#define RT_THREAD_STAT_SIGNAL 0x10
495+
#define RT_THREAD_STAT_SIGNAL 0x10 /**< task hold signals */
496496
#define RT_THREAD_STAT_SIGNAL_READY (RT_THREAD_STAT_SIGNAL | RT_THREAD_READY)
497-
#define RT_THREAD_STAT_SIGNAL_WAIT 0x20
497+
#define RT_THREAD_STAT_SIGNAL_WAIT 0x20 /**< task is waiting for signals */
498+
#define RT_THREAD_STAT_SIGNAL_PENDING 0x40 /**< signals is held and it has not been procressed */
498499
#define RT_THREAD_STAT_SIGNAL_MASK 0xf0
499500

500501
/**
@@ -596,7 +597,9 @@ struct rt_thread
596597
rt_sigset_t sig_pending; /**< the pending signals */
597598
rt_sigset_t sig_mask; /**< the mask bits of signal */
598599

600+
#ifndef RT_USING_SMP
599601
void *sig_ret; /**< the return stack pointer from signal */
602+
#endif
600603
rt_sighandler_t *sig_vectors; /**< vectors of signal handler */
601604
void *si_list; /**< the signal infor list */
602605
#endif

libcpu/arm/cortex-a/context_gcc.S

Lines changed: 27 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -46,16 +46,7 @@ rt_hw_context_switch_to:
4646
mov r0, r1
4747
bl rt_cpus_lock_status_restore
4848
#endif /*RT_USING_SMP*/
49-
50-
#ifdef RT_USING_LWP
51-
ldmfd sp, {r13, r14}^ @ pop usr_sp usr_lr
52-
add sp, #8
53-
#endif
54-
55-
ldmfd sp!, {r4} @ pop new task spsr
56-
msr spsr_cxsf, r4
57-
58-
ldmfd sp!, {r0-r12, lr, pc}^ @ pop new task r0-r12, lr & pc
49+
b rt_hw_context_switch_exit
5950

6051
.section .bss.share.isr
6152
_guest_switch_lvl:
@@ -93,15 +84,7 @@ rt_hw_context_switch:
9384
mov r0, r2
9485
bl rt_cpus_lock_status_restore
9586
#endif /*RT_USING_SMP*/
96-
97-
#ifdef RT_USING_LWP
98-
ldmfd sp, {r13, r14}^ @ pop usr_sp usr_lr
99-
add sp, #8
100-
#endif
101-
102-
ldmfd sp!, {r4} @ pop new task cpsr to spsr
103-
msr spsr_cxsf, r4
104-
ldmfd sp!, {r0-r12, lr, pc}^ @ pop new task r0-r12, lr & pc, copy spsr to cpsr
87+
b rt_hw_context_switch_exit
10588

10689
/*
10790
* void rt_hw_context_switch_interrupt(rt_uint32 from, rt_uint32 to);
@@ -123,51 +106,19 @@ rt_hw_context_switch:
123106
.globl rt_hw_context_switch_interrupt
124107
rt_hw_context_switch_interrupt:
125108
#ifdef RT_USING_SMP
126-
/* r0 :irq_mod context
109+
/* r0 :svc_mod context
127110
* r1 :addr of from_thread's sp
128111
* r2 :addr of to_thread's sp
129112
* r3 :to_thread's tcb
130113
*/
131114

132-
@ r0 point to {r0-r3} in stack
133-
push {r1 - r3}
134-
mov r1, r0
135-
add r0, r0, #4*4
136-
ldmfd r0!, {r4-r12,lr}@ reload saved registers
137-
mrs r3, spsr @ get cpsr of interrupt thread
138-
sub r2, lr, #4 @ save old task's pc to r2
139-
msr cpsr_c, #I_Bit|F_Bit|Mode_SVC
140-
141-
stmfd sp!, {r2} @ push old task's pc
142-
stmfd sp!, {r4-r12,lr}@ push old task's lr,r12-r4
143-
ldmfd r1, {r4-r7} @ restore r0-r3 of the interrupt thread
144-
stmfd sp!, {r4-r7} @ push old task's r0-r3
145-
stmfd sp!, {r3} @ push old task's cpsr
146-
147-
#ifdef RT_USING_LWP
148-
stmfd sp, {r13,r14}^ @push usr_sp usr_lr
149-
sub sp, #8
150-
#endif
151-
152-
msr cpsr_c, #I_Bit|F_Bit|Mode_IRQ
153-
pop {r1 - r3}
154-
mov sp, r0
155-
msr cpsr_c, #I_Bit|F_Bit|Mode_SVC
156-
str sp, [r1]
115+
str r0, [r1]
157116

158117
ldr sp, [r2]
159118
mov r0, r3
160119
bl rt_cpus_lock_status_restore
161120

162-
#ifdef RT_USING_LWP
163-
ldmfd sp, {r13,r14}^ @pop usr_sp usr_lr
164-
add sp, #8
165-
#endif
166-
167-
ldmfd sp!, {r4} @ pop new task's cpsr to spsr
168-
msr spsr_cxsf, r4
169-
170-
ldmfd sp!, {r0-r12,lr,pc}^ @ pop new task's r0-r12,lr & pc, copy spsr to cpsr
121+
b rt_hw_context_switch_exit
171122

172123
#else /*RT_USING_SMP*/
173124
ldr r2, =rt_thread_switch_interrupt_flag
@@ -183,3 +134,25 @@ _reswitch:
183134
str r1, [r2]
184135
bx lr
185136
#endif /*RT_USING_SMP*/
137+
138+
.global rt_hw_context_switch_exit
139+
rt_hw_context_switch_exit:
140+
141+
#ifdef RT_USING_SMP
142+
#ifdef RT_USING_SIGNALS
143+
mov r0, sp
144+
cps #Mode_IRQ
145+
bl rt_signal_check
146+
cps #Mode_SVC
147+
mov sp, r0
148+
#endif
149+
#endif
150+
151+
#ifdef RT_USING_LWP
152+
ldmfd sp, {r13, r14}^ /* usr_sp, usr_lr */
153+
add sp, #8
154+
#endif
155+
ldmfd sp!, {r1}
156+
msr spsr_cxsf, r1 /* original mode */
157+
ldmfd sp!, {r0-r12,lr,pc}^ /* irq return */
158+

0 commit comments

Comments
 (0)