29 |
30 | #ifdef __cplusplus
31 | extern "C" {
32 | #endif
33 |
34 | extern uint32_t SystemCoreClock; /*!< System Clock Frequency (Core Clock) */
35 |
36 |
37 | /**
38 | * Initialize the system
39 | *
40 | * @param none
41 | * @return none
42 | *
43 | * @brief Setup the microcontroller system.
44 | * Initialize the System and update the SystemCoreClock variable.
45 | */
46 | extern void SystemInit (void);
47 |
48 | /**
49 | * Update SystemCoreClock variable
50 | *
51 | * @param none
52 | * @return none
53 | *
54 | * @brief Updates the SystemCoreClock with current core Clock
55 | * retrieved from cpu registers.
56 | */
57 | extern void SystemCoreClockUpdate (void);
58 |
59 | #ifdef __cplusplus
60 | }
61 | #endif
62 |
63 | #endif /* SYSTEM_TM4C123_H */
64 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | CenoOS-IOT
8 |
9 |
10 | CenoOS is a real time operating system for IOT devices from cenocloud.
11 |
12 | [](https://github.com/CenoOS/CenoOS-IOT/issues)
13 | [](https://github.com/CenoOS/CenoOS-IOT/issues)
14 | [](https://discordapp.com/channels/534285557157855232/534285557157855234)
15 |
16 |
17 | # Docuemnt
18 |
19 | ## Architecture Overview
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 | ## Prepare
28 |
29 | ### 开发板
30 | 在根目录/conf/makefile.conf中修改如下配置:
31 | ```makefile
32 | # 开发板支持
33 | ARCH=arm32
34 | BOARD=ek-TM4C123gxl
35 | MCU=TM4C123GH6PM
36 | LINK_FILE=link.ld
37 | OCD_CFG_FILE=ek-tm4c123gxl.cfg
38 | ```
39 | 其中选项对应board下支持的开发版
40 |
41 | ### 配置OPENOCD
42 |
43 | ```makefile
44 | OPENOCD_SCRIPT_DIR=/usr/local/share/openocd/scripts/board
45 | ```
46 |
47 | ### 配置项目
48 |
49 | ```makefile
50 | BASE_DIR=/Users/neroyang/project/Ceno-RTOS
51 |
52 | ```
53 |
54 | ### 构建
55 |
56 | #### OPENOCD启动
57 |
58 | ```bash
59 | cd user
60 | make openOCD_connect
61 | ```
62 |
63 | #### 构建
64 |
65 | ```bash
66 | make all
67 | ```
68 |
69 | #### 烧写
70 |
71 | ```bash
72 | make flash
73 | ```
74 |
75 | ### 写在最后
76 | have a good trial!
77 |
78 | # Community
79 | discord
80 |
81 | twitch
82 |
83 | # License
84 | CenoOS is released under the Apache 2.0 license
85 |
86 |
87 | [](https://issuehunt.io/repos/157975898)
88 |
89 | 
--------------------------------------------------------------------------------
/kernel/ceno/src/os_queue.c:
--------------------------------------------------------------------------------
1 | #include "../include/os_api.h"
2 |
3 | os_err_t os_queue_create(os_queue_t* me, const cpu_char_t* name, uint32_t size){
4 | uart_debug_print("[queue] queue create : ");
5 | uart_debug_print(name);
6 | uart_debug_print("\n\r");
7 | if(size==0U){
8 | return OS_ERR;
9 | }
10 |
11 | me->elems = (uint32_t*)os_heap_malloc(size*sizeof(uint32_t));
12 | if(!me->elems){
13 | uart_debug_print("[queue] queue create : heap malloc failed!\n\r");
14 | return OS_ERR;
15 | }
16 | os_obj_t obj;
17 | obj.name = name;
18 | obj.objType = OS_OBJ_QUEUE_TYPE;
19 | me->obj = obj;
20 | me->front = 0;
21 | me->rear = 0;
22 | me->size = size;
23 |
24 | return OS_ERR_NONE;
25 | }
26 |
27 | os_err_t os_queue_item_en(os_queue_t* queue, uint32_t* itemPtr){
28 | if(os_queue_is_full(queue)==TRUE){
29 | uart_debug_print("[queue] queue en : queue is full!\n\r");
30 | return OS_ERR;
31 | }
32 | queue->elems[queue->rear] = itemPtr;
33 | queue->rear = (queue->rear + 1) % queue->size;
34 |
35 | return OS_ERR_NONE;
36 | }
37 |
38 | os_err_t os_queue_item_de(os_queue_t* queue, uint32_t* itemPtr){
39 | if(os_queue_is_empty(queue) == TRUE){
40 | uart_debug_print("[queue] queue de : queue is empty!\n\r");
41 | return OS_ERR;
42 | }
43 | *itemPtr = queue->elems[queue->front];
44 | queue->front = (queue->front + 1) % queue->size;
45 |
46 | return OS_ERR_NONE;
47 | }
48 |
49 | uint32_t os_queue_traverse(os_queue_t* queue){
50 | uint32_t i = queue->front;
51 | uart_debug_print("[queue] queue traverse \n\r");
52 | while( i != queue->rear){
53 | uart_debug_print(" |--[queue item] at : '");
54 | uart_debug_print_i32(queue->elems[i],16);
55 | uart_debug_print("'\n\r");
56 | i = (i+1) % queue->size;
57 | }
58 | }
59 |
60 | uint32_t os_queue_length(os_queue_t* queue){
61 | return (queue->rear - queue->front + queue->size) % queue->size;
62 | }
63 |
64 | uint32_t os_queue_is_empty(os_queue_t* queue){
65 | if(queue->front == queue->rear){
66 | return TRUE;
67 | }
68 | return FALSE;
69 | }
70 |
71 | uint32_t os_queue_is_full(os_queue_t* queue){
72 | if((queue->rear + 1) % queue->size == queue->front){
73 | return TRUE;
74 | }
75 | return FALSE;
76 | }
--------------------------------------------------------------------------------
/kernel/network/mqtt/include/mqtt.h:
--------------------------------------------------------------------------------
1 | #ifndef __CENO_NET_MQTT_H__
2 | #define __CENO_NET_MQTT_H__
3 |
4 |
5 | #include "../include/packet.h"
6 |
7 | #define EV_MQTT_BASE 0x100
8 | #define EV_MQTT_CONNECT (EV_MQTT_BASE + MQTT_PACKET_TYPE_CONNECT)
9 | #define EV_MQTT_CONNACK (EV_MQTT_BASE + MQTT_PACKET_TYPE_CONNACK)
10 | #define EV_MQTT_PUBLISH (EV_MQTT_BASE + MQTT_PACKET_TYPE_PUBLISH)
11 | #define EV_MQTT_PUBACK (EV_MQTT_BASE + MQTT_PACKET_TYPE_PUBACK)
12 | #define EV_MQTT_PUBREC (EV_MQTT_BASE + MQTT_PACKET_TYPE_PUBREC)
13 | #define EV_MQTT_PUBREL (EV_MQTT_BASE + MQTT_PACKET_TYPE_PUBREL)
14 | #define EV_MQTT_PUBCOMP (EV_MQTT_BASE + MQTT_PACKET_TYPE_PUBCOMP)
15 | #define EV_MQTT_SUBSCRIBE (EV_MQTT_BASE + MQTT_PACKET_TYPE_SUBSCRIBE)
16 | #define EV_MQTT_SUBACK (EV_MQTT_BASE + MQTT_PACKET_TYPE_SUBACK)
17 | #define EV_MQTT_UNSUBSCRIBE (EV_MQTT_BASE + MQTT_PACKET_TYPE_UNSUBSCRIBE)
18 | #define EV_MQTT_UNSUBACK (EV_MQTT_BASE + MQTT_PACKET_TYPE_UNSUBACK)
19 | #define EV_MQTT_PINGREQ (EV_MQTT_BASE + MQTT_PACKET_TYPE_PINGREQ)
20 | #define EV_MQTT_PINGRESP (EV_MQTT_BASE + MQTT_PACKET_TYPE_PINGRESP)
21 | #define EV_MQTT_DISCONNECT (EV_MQTT_BASE + MQTT_PACKET_TYPE_DISCONNECT)
22 |
23 |
24 |
25 | #define MAX_PACKET_ID 0xFFFF
26 |
27 | typedef enum QoS
28 | {
29 | QOS0,
30 | QOS1,
31 | QOS2
32 | } QoS_e;
33 |
34 | typedef struct mqtt_proto_data mqtt_proto_data_t;
35 |
36 | typedef struct mqtt_msg
37 | {
38 | unsigned char type;
39 | QoS_e qos;
40 | unsigned int len;
41 | unsigned char retained;
42 | unsigned char dup;
43 | unsigned short id;
44 | void *payload;
45 | size_t payloadlen;
46 | mqtt_proto_data_t *mqtt_data;
47 | } mqtt_msg_t;
48 |
49 | typedef struct mqtt_suback_data
50 | {
51 | QoS_e grantedQoS;
52 | } mqtt_suback_data_t;
53 |
54 |
55 | typedef void (*mqtt_msg_handler)(void *);
56 |
57 | typedef struct mqtt_proto_data
58 | {
59 | unsigned short keep_alive;
60 | time_t last_time;
61 | unsigned int next_packetid;
62 | struct MessageHandlers
63 | {
64 | unsigned char efficient;
65 | const char* topicFilter;
66 | mqtt_msg_handler cb;
67 | } messageHandlers[MQTT_BUILTIN_NUM]; /* Message handlers are indexed by subscription topic */
68 | } mqtt_proto_data_t;
69 |
70 | int mqtt_packetid(connection_t *nc);
71 | int mqtt_connect(connection_t *nc, mqtt_connect_opt_t *options);
72 | int mqtt_publish(connection_t *nc, mqtt_publish_opt_t *options);
73 | int mqtt_subscribe(connection_t *nc, mqtt_subscribe_opt_t *options, mqtt_msg_handler *cbs);
74 | int mqtt_puback(connection_t *nc, mqtt_puback_opt_t *options);
75 | int mqtt_ping(connection_t *nc);
76 | int mqtt_unsubscribe(connection_t *nc, mqtt_unsubscribe_opt_t *options);
77 | void mqtt_event_handler(connection_t *nc, int event, void *event_data);
78 |
79 | #endif // ! __CENO_NET_MQTT_H__
--------------------------------------------------------------------------------
/user/asm/main.s:
--------------------------------------------------------------------------------
1 | .cpu arm7tdmi
2 | .eabi_attribute 20, 1
3 | .eabi_attribute 21, 1
4 | .eabi_attribute 23, 3
5 | .eabi_attribute 24, 1
6 | .eabi_attribute 25, 1
7 | .eabi_attribute 26, 1
8 | .eabi_attribute 30, 6
9 | .eabi_attribute 34, 0
10 | .eabi_attribute 18, 4
11 | .file "main.c"
12 | .text
13 | .comm task_01,52,4
14 | .comm stack_task_01,160,4
15 | .section .rodata
16 | .align 2
17 | .LC0:
18 | .ascii "[task] task 1 \012\015\000"
19 | .text
20 | .align 2
21 | .global task_01_thread
22 | .syntax unified
23 | .arm
24 | .fpu softvfp
25 | .type task_01_thread, %function
26 | task_01_thread:
27 | @ Function supports interworking.
28 | @ args = 0, pretend = 0, frame = 0
29 | @ frame_needed = 1, uses_anonymous_args = 0
30 | push {fp, lr}
31 | add fp, sp, #4
32 | .L2:
33 | ldr r0, .L3
34 | bl uart_debug_print
35 | b .L2
36 | .L4:
37 | .align 2
38 | .L3:
39 | .word .LC0
40 | .size task_01_thread, .-task_01_thread
41 | .comm task_02,52,4
42 | .comm stack_task_02,160,4
43 | .section .rodata
44 | .align 2
45 | .LC1:
46 | .ascii "[task] task 2 \012\015\000"
47 | .text
48 | .align 2
49 | .global task_02_thread
50 | .syntax unified
51 | .arm
52 | .fpu softvfp
53 | .type task_02_thread, %function
54 | task_02_thread:
55 | @ Function supports interworking.
56 | @ args = 0, pretend = 0, frame = 0
57 | @ frame_needed = 1, uses_anonymous_args = 0
58 | push {fp, lr}
59 | add fp, sp, #4
60 | .L6:
61 | ldr r0, .L7
62 | bl uart_debug_print
63 | b .L6
64 | .L8:
65 | .align 2
66 | .L7:
67 | .word .LC1
68 | .size task_02_thread, .-task_02_thread
69 | .section .rodata
70 | .align 2
71 | .LC2:
72 | .ascii "[debug] _______________begin______________\012\015\000"
73 | .align 2
74 | .LC3:
75 | .ascii "[main] main start.\012\015\000"
76 | .align 2
77 | .LC4:
78 | .ascii "task_01\000"
79 | .align 2
80 | .LC5:
81 | .ascii "task_02\000"
82 | .text
83 | .align 2
84 | .global main
85 | .syntax unified
86 | .arm
87 | .fpu softvfp
88 | .type main, %function
89 | main:
90 | @ Function supports interworking.
91 | @ args = 0, pretend = 0, frame = 8
92 | @ frame_needed = 1, uses_anonymous_args = 0
93 | push {fp, lr}
94 | add fp, sp, #4
95 | sub sp, sp, #16
96 | bl bsp_init
97 | ldr r0, .L11
98 | bl uart_debug_print
99 | ldr r0, .L11+4
100 | bl uart_debug_print
101 | bl os_init
102 | ldr r3, .L11+8
103 | str r3, [sp, #4]
104 | mov r3, #160
105 | str r3, [sp]
106 | ldr r3, .L11+12
107 | mov r2, #5
108 | ldr r1, .L11+16
109 | ldr r0, .L11+20
110 | bl os_task_create
111 | mov r3, r0
112 | strb r3, [fp, #-5]
113 | ldr r3, .L11+24
114 | str r3, [sp, #4]
115 | mov r3, #160
116 | str r3, [sp]
117 | ldr r3, .L11+28
118 | mov r2, #4
119 | ldr r1, .L11+32
120 | ldr r0, .L11+36
121 | bl os_task_create
122 | mov r3, r0
123 | strb r3, [fp, #-6]
124 | bl os_run
125 | mov r3, #0
126 | mov r0, r3
127 | sub sp, fp, #4
128 | @ sp needed
129 | pop {fp, lr}
130 | bx lr
131 | .L12:
132 | .align 2
133 | .L11:
134 | .word .LC2
135 | .word .LC3
136 | .word task_01_thread
137 | .word stack_task_01
138 | .word .LC4
139 | .word task_01
140 | .word task_02_thread
141 | .word stack_task_02
142 | .word .LC5
143 | .word task_02
144 | .size main, .-main
145 | .ident "GCC: (GNU Tools for Arm Embedded Processors 7-2018-q2-update) 7.3.1 20180622 (release) [ARM/embedded-7-branch revision 261907]"
146 |
--------------------------------------------------------------------------------
/user/Makefile:
--------------------------------------------------------------------------------
1 | include ../conf/conf.mk
2 |
3 | MATCH="match"
4 |
5 | build: $(OBJS) bin/$(PROJECT_NAME).bin
6 | # ==================================================================
7 | # 用户C代码
8 | $(OBJ)%.o: src/%.c
9 | $(MKDIR)
10 | $(CC) -o $@ $^ $(CPPFLAGS) $(CFLAGS)
11 |
12 | # 板载C代码
13 | $(OBJ)%.o: $(BASE_DIR)/board/arch/${ARCH}/${BOARD}/${MCU}/src/%.c
14 | $(MKDIR)
15 | $(CC) -o $@ $^ $(CPPFLAGS) $(CFLAGS)
16 |
17 | # 板子硬件抽象层C代码
18 | $(OBJ)%.o: $(BASE_DIR)/board/arch/${ARCH}/${BOARD}/${MCU}/ceno_os/src/%.c
19 | $(MKDIR)
20 | $(CC) -o $@ $^ $(CPPFLAGS) $(CFLAGS)
21 |
22 | # 内核C代码
23 | $(OBJ)%.o: $(BASE_DIR)/kernel/ceno/src/%.c
24 | $(MKDIR)
25 | $(CC) -o $@ $^ $(CPPFLAGS) $(CFLAGS)
26 |
27 | # 用户汇编代码
28 | $(OBJ)%.o: src/%.s
29 | $(MKDIR)
30 | $(AS) -o $@ $^ $(CPPFLAGS) $(ASFLAGS)
31 |
32 | # 板载汇编
33 | $(OBJ)%.o: $(BASE_DIR)/board/arch/${ARCH}/${BOARD}/${MCU}/src/%.s
34 | $(MKDIR)
35 | $(AS) -o $@ $^ $(CPPFLAGS) $(ASFLAGS)
36 |
37 | # ==================================================================
38 | optimize: $(OPTMIZES)
39 | # 优化c代码
40 | $(OPTMIZE)%.i: src/%.c
41 | $(MKDIR)
42 | $(CC) -E $^ -o $@ $(CPPFLAGS) $(CFLAGS)
43 |
44 | $(OPTMIZE)%.i: $(BASE_DIR)/board/arch/${ARCH}/${BOARD}/${MCU}/src/%.c
45 | $(MKDIR)
46 | $(CC) -E $^ -o $@ $(CPPFLAGS) $(CFLAGS)
47 |
48 | $(OPTMIZE)%.i: $(BASE_DIR)/board/arch/${ARCH}/${BOARD}/${MCU}/ceno_os/src/%.c
49 | $(MKDIR)
50 | $(CC) -E $^ -o $@ $(CPPFLAGS) $(CFLAGS)
51 |
52 | $(OPTMIZE)%.i: $(BASE_DIR)/kernel/ceno/src/%.c
53 | $(MKDIR)
54 | $(CC) -E $^ -o $@ $(CPPFLAGS) $(CFLAGS)
55 |
56 | # ==================================================================
57 | dump: bin/$(PROJECT_NAME).asm
58 |
59 | bin/$(PROJECT_NAME).asm: bin/$(PROJECT_NAME).bin
60 | $(OBJDUMP) -D -S -s -b binary -m arm $< > $@
61 |
62 | asm: $(ASMCODES)
63 | # 汇编代码生成
64 | $(ASMCODE)%.s: $(OPTMIZE)/%.i
65 | $(MKDIR)
66 | $(CC) -S $^ -o $@
67 | # ==================================================================
68 |
69 | bin/$(PROJECT_NAME).elf: $(OBJS)
70 | $(MKDIR)
71 | $(LD) -o $@ $^ $(LDFLAGS)
72 |
73 | bin/$(PROJECT_NAME).bin: bin/$(PROJECT_NAME).elf
74 | $(OBJCOPY) -O binary $< $@
75 |
76 | # ==================================================================
77 |
78 |
79 | read:
80 | ${ELFREAD} -h ${BASE_DIR}/${BUILD_DIR}/os.elf
81 |
82 | debug:
83 | echo ${OBJS}
84 |
85 | # 查看当前系统OPENOCD支持开发板
86 | openOCD_boards:
87 | ls ${OPENOCD_SCRIPT_DIR}
88 |
89 |
90 | openOCD_kill:
91 | OPENOCD_PIDS=$$(ps -ef | grep "openocd" | grep -v "$$0" | grep -v "grep" | awk '{print $$2}'); \
92 | echo $$OPENOCD_PIDS; \
93 | if [ $$OPENOCD_PIDS ]; then \
94 | kill -9 $$OPENOCD_PIDS; \
95 | fi
96 |
97 | # 连接
98 | openOCD_connect: openOCD_kill
99 | nohup openocd -f ${OPENOCD_SCRIPT_DIR}/${OCD_CFG_FILE} &
100 | telnet localhost 4444
101 |
102 | openOCD_bug:
103 | openocd -f interface/dummy.cfg -f ${OPENOCD_SCRIPT_DIR}/${OCD_CFG_FILE}
104 |
105 | flash:
106 | (echo halt;echo flash erase_sector 0 0 ${FLASH_SECTOR};echo flash write_image erase ${BASE_DIR}/user/bin/${PROJECT_NAME}.bin 0;echo reset;) | telnet localhost 4444 | grep "#0"
107 |
108 | verify:
109 | (echo halt;echo flash verify_bank 0 ${BASE_DIR}/user/bin/${PROJECT_NAME}.bin 0;) | telnet localhost 4444 | grep ${MATCH}
110 |
111 | clean:
112 | rm -rf ${BASE_DIR}/user/bin
113 | rm -rf ${BASE_DIR}/user/obj
114 | rm -rf ${BASE_DIR}/user/asm
115 | rm -rf ${BASE_DIR}/user/optimize
116 | usb:
117 | # system_profiler SPUSBDataType
118 | lsusb
119 |
120 | gdb:
121 | $(GDB)
122 |
123 | all: clean optimize asm build dump
124 | # doc:
125 | # /usr/local/Cellar/node/7.4.0/lib/node_modules/docsify-cli/bin/docsify serve ../docs/docs
126 |
--------------------------------------------------------------------------------
/conf/conf.mk:
--------------------------------------------------------------------------------
1 | # ====================================================================
2 | # 项目目录
3 | BASE_DIR=/Users/neroyang/project/Ceno-RTOS
4 | BUILD_DIR=build
5 | DEBUG_DIR=debug
6 | # ====================================================================
7 | # 项目名称
8 | PROJECT_NAME=CenoRTOS
9 | # 开发板支持
10 | ARCH=arm32
11 | BOARD=ek-TM4C123gxl
12 | MCU=TM4C123GH6PM
13 | LINK_FILE=link.ld
14 | OCD_CFG_FILE=ek-tm4c123gxl.cfg
15 |
16 | # BOARD=alios_things_starter_kit
17 | # MCU=stm32l
18 | # LINK_FILE=STM32L433RCTxP_FLASH.ld
19 | # OCD_CFG_FILE=stm32l4discovery.cfg
20 | # ====================================================================
21 | # 用户C代码
22 | SRC=$(wildcard src/*.c)
23 | # 板载C代码
24 | SRC+=$(wildcard $(BASE_DIR)/board/arch/${ARCH}/${BOARD}/${MCU}/src/*.c)
25 | # 内核C代码
26 | SRC+=$(wildcard $(BASE_DIR)/kernel/ceno/src/*.c)
27 | # 硬件抽象层C代码
28 | SRC+=$(wildcard $(BASE_DIR)/board/arch/${ARCH}/${BOARD}/${MCU}/ceno_os/src/*.c)
29 |
30 | # 用户汇编代码
31 | ASM=$(wildcard src/*.s)
32 | # 板载汇编代码
33 | ASM+=$(wildcard $(BASE_DIR)/board/arch/${ARCH}/${BOARD}/${MCU}/src/*.s)
34 | # 内核汇编代码
35 | # 硬件抽象层汇编代码
36 |
37 | OBJ=obj/
38 | OBJS=$(addprefix $(OBJ),$(notdir $(SRC:.c=.o)))
39 | OBJS+=$(addprefix $(OBJ),$(notdir $(ASM:.s=.o)))
40 |
41 | OPTMIZE=optimize/
42 | OPTMIZES=$(addprefix $(OPTMIZE),$(notdir $(SRC:.c=.i)))
43 | OPTMIZES+=$(addprefix $(OPTMIZE),$(notdir $(ASM:.s=.i)))
44 |
45 | OPTMIZE_PATH=$(wildcard optimize/*.i)
46 | ASMCODE=asm/
47 | ASMCODES=$(addprefix $(ASMCODE),$(notdir $(OPTMIZE_PATH:.i=.s)))
48 | # ASMCODES+=$(addprefix $(ASMCODE),$(notdir $(ASM:.s=.i)))
49 |
50 | # ====================================================================
51 | # CMSMS
52 | CMSIS=$(BASE_DIR)/lib/SMSIS/Include
53 | # QPC
54 | QPC=$(BASE_DIR)/lib/QPC/Include
55 | # 内核
56 | CENO_KERNEL=$(BASE_DIR)/kernel/ceno/include
57 | # drivers
58 | DRIVERS=$(BASE_DIR)/board/arch/${ARCH}/${BOARD}/${MCU}/include
59 | # bsp
60 | BSP=$(BASE_DIR)/board/arch/${ARCH}/${BOARD}/${MCU}/ceno_os/include
61 | # user_config
62 | USER_CONFIG=$(BASE_DIR)/user/include
63 | # include
64 | CPPFLAGS=-I include
65 | CPPFLAGS += -I ${DRIVERS}
66 | CPPFLAGS += -I ${CMSIS}
67 | CPPFLAGS += -I ${QPC}
68 | CPPFLAGS += -I ${CENO_KERNEL}
69 | CPPFLAGS += -I ${BSP}
70 | CPPFLAGS += -I ${USER_CONFIG}
71 | # ====================================================================
72 | CFLAGS=-ggdb -mthumb -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=softfp
73 | # CFLAGS += -Os -ffunction-sections -fdata-sections -MD -std=c99
74 | CFLAGS += -MD -std=c99
75 | CFLAGS += -pedantic -DPART_${MCU} -c
76 | CFLAGS += -DTARGET_IS_BLIZZARD_RA1
77 | CFLAGS += -w
78 | # ====================================================================
79 |
80 | # ASFLAGS=-ggdb -mthumb -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=softfp
81 | # ASFLAGS += -ffunction-sections -fdata-sections -MD -std=c99
82 | # ASFLAGS += -pedantic -DPART_${MCU} -c
83 | # ASFLAGS += -DTARGET_IS_BLIZZARD_RA1
84 |
85 | # ====================================================================
86 | # 链接脚本
87 | LD_SCRIPT=$(BASE_DIR)/board/arch/${ARCH}/${BOARD}/${MCU}/ld/${LINK_FILE}
88 | LDFLAGS=-T $(LD_SCRIPT) --entry Reset_Handler --gc-sections
89 | # ====================================================================
90 | # 编译器
91 | CC=~/gcc-arm-none-eabi/bin/arm-none-eabi-gcc
92 | AS=~/gcc-arm-none-eabi/bin/arm-none-eabi-as
93 | CXX=~/gcc-arm-none-eabi/bin/arm-none-eabi-g++
94 | LD=~/gcc-arm-none-eabi/bin/arm-none-eabi-ld
95 | OBJCOPY=~/gcc-arm-none-eabi/bin/arm-none-eabi-objcopy
96 | ELFREAD=~/gcc-arm-none-eabi/bin/arm-none-eabi-readelf
97 | OBJDUMP=~/gcc-arm-none-eabi/bin/arm-none-eabi-objdump
98 |
99 | GDB=~/gcc-arm-none-eabi/bin/arm-none-eabi-gdb
100 | # ====================================================================
101 | MKDIR=@mkdir -p $(@D)
102 | # ====================================================================
103 | # openOCD目录
104 | OPENOCD_SCRIPT_DIR=/usr/local/share/openocd/scripts/board
105 | # ====================================================================
106 | # flash
107 | FLASH_SECTOR=255
108 | # ====================================================================
--------------------------------------------------------------------------------
/kernel/ceno/src/os_kernel.c:
--------------------------------------------------------------------------------
1 | /**
2 | * Ceno RTOS task
3 | *
4 | * 2018-12-17
5 | * neroyang
6 | *
7 | * Copyright (C) 2018 CenoCloud. All Rights Reserved
8 | *
9 | * Contract Information:
10 | * nerosoft@outlook.com
11 | * https://www.cenocloud.com
12 | */
13 | #include "../include/os_api.h"
14 |
15 | #define TASK_MAX_SIZE 32
16 |
17 | os_queue_t osTaskQueue;
18 | os_queue_t osReadyTaskQueue;
19 |
20 | volatile os_task_t osIdleTask;
21 | uint32_t stackTaskIdle[40];
22 |
23 | os_err_t os_init(void){
24 | uart_debug_print("[kernel] os init.\n\r");
25 | os_heap_init();
26 |
27 | /**
28 | * Set the pendSV interrput priority to the losest level 0xFF
29 | */
30 | *(uint32_t volatile *)0xE000ED20 |= (0xFFU << 16);
31 |
32 |
33 | /**
34 | * os objects container init
35 | */
36 | os_err_t isOsObjectContainerInit = os_obj_container_init();
37 | if(isOsObjectContainerInit==OS_ERR){
38 | return isOsObjectContainerInit;
39 | }
40 |
41 | /* task queue create*/
42 | os_err_t isOsTaskQueueCreate = os_queue_create(&osTaskQueue,"task queue",TASK_MAX_SIZE);
43 | if(isOsTaskQueueCreate==OS_ERR){
44 | return isOsTaskQueueCreate;
45 | }
46 |
47 | /* ready task queue create*/
48 | os_err_t isOsReadyTaskQueueCreate = os_queue_create(&osReadyTaskQueue,"ready task queue",TASK_MAX_SIZE);
49 | if(isOsReadyTaskQueueCreate==OS_ERR){
50 | return isOsReadyTaskQueueCreate;
51 | }
52 |
53 | /**
54 | * os idle task init
55 | */
56 | os_err_t isOsIdleTaskInit = os_task_create(
57 | &osIdleTask,
58 | "taskIdle",
59 | 0,
60 | stackTaskIdle,
61 | sizeof(stackTaskIdle),
62 | &os_idle
63 | );
64 |
65 | osTaskCurr = &osIdleTask;
66 |
67 | if(isOsIdleTaskInit==OS_ERR){
68 | return isOsIdleTaskInit;
69 | }
70 | }
71 |
72 | void task_idle_thread(){
73 | for(unsigned int i = 0;i<~0;i++){
74 | uart_debug_print("[task] idle. ");
75 | uart_debug_print_i32(i,10);
76 | uart_debug_print("\n\r");
77 | }
78 | }
79 |
80 | os_err_t os_run(void){
81 | os_queue_traverse(&osTaskQueue);
82 | uart_debug_print("[kernel] os run.\n\r");
83 | /* callback to configure and start interrupts */
84 | os_on_startup();
85 |
86 | disable_irq();
87 | os_sched();
88 | enable_irq();
89 | }
90 |
91 | os_err_t os_idle(void){
92 | while(1){
93 | task_idle_thread();
94 | }
95 | }
96 |
97 | os_err_t os_tick(void){
98 | uint32_t i = osTaskQueue.front;
99 | uart_debug_print("[task] tasks traverse \n\r");
100 | os_task_t *highTask = &osIdleTask;
101 | while( i != osTaskQueue.rear){
102 | os_task_t *t = (os_task_t *)osTaskQueue.elems[i];
103 | uart_debug_print(" |--[task] task : '");
104 | uart_debug_print(t->obj.name);
105 | uart_debug_print("', timeout : '");
106 | uart_debug_print_i32(t->timeout,10);
107 | uart_debug_print("ms'\n\r");
108 | if(t->timeout > 0){
109 | t->timeout--;
110 | if (t->timeout == 0U) {
111 | t->state = OS_STATE_READY;
112 | }
113 | }
114 |
115 | if(t->state == OS_STATE_READY && (t->priority > highTask->priority)){
116 | highTask = t;
117 | }
118 | i = (i+1) % osTaskQueue.size;
119 | }
120 | os_queue_item_en(&osReadyTaskQueue,highTask);
121 | }
122 |
123 | os_task_t* os_get_next_ready_from_task_queue(os_queue_t* queue){
124 | uart_debug_print("[kernel] os ready queue size : '");
125 | uart_debug_print_i32(os_queue_length(queue),10);
126 | uart_debug_print("'\n\r");
127 | uint32_t ptrToTask;
128 | os_queue_item_de(queue,&ptrToTask);
129 | os_task_t* t = (os_task_t *)ptrToTask;
130 | return t;
131 | }
132 |
133 | os_err_t os_sched(void){
134 | uart_debug_print("[kernel] os sched.\n\r");
135 | if(os_queue_length(&osReadyTaskQueue)<=0U){
136 | osTaskNext = &osIdleTask;
137 | }else{
138 | osTaskNext = os_get_next_ready_from_task_queue(&osReadyTaskQueue);
139 | }
140 | uart_debug_print("[scheduler] next task : '");
141 | uart_debug_print(osTaskNext->obj.name);
142 | uart_debug_print("'\n\r");
143 |
144 |
145 | *(uint32_t volatile *)0xE000ED04 = (1U << 27);
146 | uart_debug_print_i32(*(uint32_t volatile *)0xE000ED04>>28 & 1,10);
147 | uart_debug_print("\n\r");
148 | *(uint32_t volatile *)0xE000ED04 = (1U << 28);
149 | uart_debug_print_i32(*(uint32_t volatile *)0xE000ED04>>28 & 1,10);
150 | uart_debug_print("\n\r");
151 | uart_debug_print_i32(*(uint32_t volatile *)0xE000ED24>>10 & 1,10);
152 | uart_debug_print("\n\r");
153 |
154 | /* trigger PendSV, if needed */
155 | if (osTaskNext != osTaskCurr) {
156 | /* todo : this need be a hal function */
157 | *(uint32_t volatile *)0xE000ED04 = (1U << 28);
158 | }
159 | }
160 |
--------------------------------------------------------------------------------
/board/arch/arm32/ek-TM4C123gxl/TM4C123GH6PM/ceno_os/include/interrupt.h:
--------------------------------------------------------------------------------
1 | #ifndef __CENO_RTOS_INTERRUPT_H__
2 | #define __CENO_RTOS_INTERRUPT_H__
3 |
4 | #include "os.h"
5 |
6 |
7 | extern os_err_t os_tick(void);
8 | extern os_err_t os_idle(void);
9 | extern os_err_t os_task_switch_next(void);
10 |
11 | void SysTick_Handler(void);
12 | void PendSV_Handler(void);
13 | void NMI_Handler(void);
14 | void MemManage_Handler(void);
15 | void BusFault_Handler(void);
16 | void UsageFault_Handler(void);
17 | void HardFault_Handler(void);
18 | void SVC_Handler(void);
19 | void DebugMon_Handler(void);
20 | void GPIOPortA_IRQHandler(void);
21 | void GPIOPortB_IRQHandler(void);
22 | void GPIOPortC_IRQHandler(void);
23 | void GPIOPortD_IRQHandler(void);
24 | void GPIOPortE_IRQHandler(void);
25 | void UART0_IRQHandler(void);
26 | void UART1_IRQHandler(void);
27 | void SSI0_IRQHandler(void);
28 | void I2C0_IRQHandler(void);
29 | void PWMFault_IRQHandler(void);
30 | void PWMGen0_IRQHandler(void);
31 | void PWMGen1_IRQHandler(void);
32 | void PWMGen2_IRQHandler(void);
33 | void QEI0_IRQHandler(void);
34 | void ADCSeq0_IRQHandler(void);
35 | void ADCSeq1_IRQHandler(void);
36 | void ADCSeq2_IRQHandler(void);
37 | void ADCSeq3_IRQHandler(void);
38 | void Watchdog_IRQHandler(void);
39 | void Timer0A_IRQHandler(void);
40 | void Timer0B_IRQHandler(void);
41 | void Timer1A_IRQHandler(void);
42 | void Timer1B_IRQHandler(void);
43 | void Timer2A_IRQHandler(void);
44 | void Timer2B_IRQHandler(void);
45 | void Comp0_IRQHandler(void);
46 | void Comp1_IRQHandler(void);
47 | void Comp2_IRQHandler(void);
48 | void SysCtrl_IRQHandler(void);
49 | void FlashCtrl_IRQHandler(void);
50 | void GPIOPortF_IRQHandler(void);
51 | void GPIOPortG_IRQHandler(void);
52 | void GPIOPortH_IRQHandler(void);
53 | void UART2_IRQHandler(void);
54 | void SSI1_IRQHandler(void);
55 | void Timer3A_IRQHandler(void);
56 | void Timer3B_IRQHandler(void);
57 | void I2C1_IRQHandler(void);
58 | void QEI1_IRQHandler(void);
59 | void CAN0_IRQHandler(void);
60 | void CAN1_IRQHandler(void);
61 | void CAN2_IRQHandler(void);
62 | void Hibernate_IRQHandler(void);
63 | void USB0_IRQHandler(void);
64 | void PWMGen3_IRQHandler(void);
65 | void uDMAST_IRQHandler(void);
66 | void uDMAError_IRQHandler(void);
67 | void ADC1Seq0_IRQHandler(void);
68 | void ADC1Seq1_IRQHandler(void);
69 | void ADC1Seq2_IRQHandler(void);
70 | void ADC1Seq3_IRQHandler(void);
71 | void I2S0_IRQHandler(void);
72 | void EBI0_IRQHandler(void);
73 | void GPIOPortJ_IRQHandler(void);
74 | void GPIOPortK_IRQHandler(void);
75 | void GPIOPortL_IRQHandler(void);
76 | void SSI2_IRQHandler(void);
77 | void SSI3_IRQHandler(void);
78 | void UART3_IRQHandler(void);
79 | void UART4_IRQHandler(void);
80 | void UART5_IRQHandler(void);
81 | void UART6_IRQHandler(void);
82 | void UART7_IRQHandler(void);
83 | void I2C2_IRQHandler(void);
84 | void I2C3_IRQHandler(void);
85 | void Timer4A_IRQHandler(void);
86 | void Timer4B_IRQHandler(void);
87 | void Timer5A_IRQHandler(void);
88 | void Timer5B_IRQHandler(void);
89 | void WideTimer0A_IRQHandler(void);
90 | void WideTimer0B_IRQHandler(void);
91 | void WideTimer1A_IRQHandler(void);
92 | void WideTimer1B_IRQHandler(void);
93 | void WideTimer2A_IRQHandler(void);
94 | void WideTimer2B_IRQHandler(void);
95 | void WideTimer3A_IRQHandler(void);
96 | void WideTimer3B_IRQHandler(void);
97 | void WideTimer4A_IRQHandler(void);
98 | void WideTimer4B_IRQHandler(void);
99 | void WideTimer5A_IRQHandler(void);
100 | void WideTimer5B_IRQHandler(void);
101 | void FPU_IRQHandler(void);
102 | void PECI0_IRQHandler(void);
103 | void LPC0_IRQHandler(void);
104 | void I2C4_IRQHandler(void);
105 | void I2C5_IRQHandler(void);
106 | void GPIOPortM_IRQHandler(void);
107 | void GPIOPortN_IRQHandler(void);
108 | void QEI2_IRQHandler(void);
109 | void Fan0_IRQHandler(void);
110 | void GPIOPortP0_IRQHandler(void);
111 | void GPIOPortP1_IRQHandler(void);
112 | void GPIOPortP2_IRQHandler(void);
113 | void GPIOPortP3_IRQHandler(void);
114 | void GPIOPortP4_IRQHandler(void);
115 | void GPIOPortP5_IRQHandler(void);
116 | void GPIOPortP6_IRQHandler(void);
117 | void GPIOPortP7_IRQHandler(void);
118 | void GPIOPortQ0_IRQHandler(void);
119 | void GPIOPortQ1_IRQHandler(void);
120 | void GPIOPortQ2_IRQHandler(void);
121 | void GPIOPortQ3_IRQHandler(void);
122 | void GPIOPortQ4_IRQHandler(void);
123 | void GPIOPortQ5_IRQHandler(void);
124 | void GPIOPortQ6_IRQHandler(void);
125 | void GPIOPortQ7_IRQHandler(void);
126 | void GPIOPortR_IRQHandler(void);
127 | void GPIOPortS_IRQHandler(void);
128 | void PWM1Gen0_IRQHandler(void);
129 | void PWM1Gen1_IRQHandler(void);
130 | void PWM1Gen2_IRQHandler(void);
131 | void PWM1Gen3_IRQHandler(void);
132 | void PWM1Fault_IRQHandler(void);
133 | void SystemException_ISR(void);
134 |
135 |
136 | #endif // !__CENO_RTOS_INTERRUPT_H__
--------------------------------------------------------------------------------
/user/asm/os_semphore.s:
--------------------------------------------------------------------------------
1 | .cpu arm7tdmi
2 | .eabi_attribute 20, 1
3 | .eabi_attribute 21, 1
4 | .eabi_attribute 23, 3
5 | .eabi_attribute 24, 1
6 | .eabi_attribute 25, 1
7 | .eabi_attribute 26, 1
8 | .eabi_attribute 30, 6
9 | .eabi_attribute 34, 0
10 | .eabi_attribute 18, 4
11 | .file "os_semphore.c"
12 | .text
13 | .align 2
14 | .global os_sem_create
15 | .syntax unified
16 | .arm
17 | .fpu softvfp
18 | .type os_sem_create, %function
19 | os_sem_create:
20 | @ Function supports interworking.
21 | @ args = 0, pretend = 0, frame = 32
22 | @ frame_needed = 1, uses_anonymous_args = 0
23 | push {fp, lr}
24 | add fp, sp, #4
25 | sub sp, sp, #32
26 | str r0, [fp, #-24]
27 | str r1, [fp, #-28]
28 | str r2, [fp, #-32]
29 | ldr r3, [fp, #-32]
30 | cmp r3, #0
31 | bne .L2
32 | mov r3, #1
33 | b .L5
34 | .L2:
35 | ldr r3, [fp, #-28]
36 | cmp r3, #0
37 | bne .L4
38 | mov r3, #1
39 | b .L5
40 | .L4:
41 | mov r3, #2
42 | strb r3, [fp, #-8]
43 | ldr r3, [fp, #-28]
44 | str r3, [fp, #-12]
45 | ldr r3, [fp, #-24]
46 | mov ip, r3
47 | sub r3, fp, #20
48 | ldm r3, {r0, r1, r2, r3}
49 | stm ip, {r0, r1, r2, r3}
50 | ldr r3, [fp, #-24]
51 | ldr r2, [fp, #-32]
52 | str r2, [r3, #16]
53 | ldr r3, [fp, #-24]
54 | add r3, r3, #24
55 | mov r2, #10
56 | ldr r1, [fp, #-28]
57 | mov r0, r3
58 | bl os_queue_create
59 | mov r3, r0
60 | .L5:
61 | mov r0, r3
62 | sub sp, fp, #4
63 | @ sp needed
64 | pop {fp, lr}
65 | bx lr
66 | .size os_sem_create, .-os_sem_create
67 | .align 2
68 | .global os_sem_del
69 | .syntax unified
70 | .arm
71 | .fpu softvfp
72 | .type os_sem_del, %function
73 | os_sem_del:
74 | @ Function supports interworking.
75 | @ args = 0, pretend = 0, frame = 16
76 | @ frame_needed = 1, uses_anonymous_args = 0
77 | push {fp, lr}
78 | add fp, sp, #4
79 | sub sp, sp, #16
80 | str r0, [fp, #-16]
81 | bl __DISABLE_IRQ
82 | ldr r3, [fp, #-16]
83 | ldr r3, [r3, #16]
84 | cmp r3, #0
85 | beq .L7
86 | ldr r3, [fp, #-16]
87 | ldr r3, [r3, #16]
88 | sub r2, r3, #1
89 | ldr r3, [fp, #-16]
90 | str r2, [r3, #16]
91 | b .L8
92 | .L7:
93 | ldr r3, [fp, #-8]
94 | mov r2, #3
95 | strb r2, [r3, #32]
96 | ldr r3, [fp, #-16]
97 | add r3, r3, #24
98 | ldr r1, [fp, #-8]
99 | mov r0, r3
100 | bl os_queue_add_item
101 | .L8:
102 | bl __ENABLE_IRQ
103 | nop
104 | mov r0, r3
105 | sub sp, fp, #4
106 | @ sp needed
107 | pop {fp, lr}
108 | bx lr
109 | .size os_sem_del, .-os_sem_del
110 | .align 2
111 | .global os_sem_give
112 | .syntax unified
113 | .arm
114 | .fpu softvfp
115 | .type os_sem_give, %function
116 | os_sem_give:
117 | @ Function supports interworking.
118 | @ args = 0, pretend = 0, frame = 8
119 | @ frame_needed = 1, uses_anonymous_args = 0
120 | push {fp, lr}
121 | add fp, sp, #4
122 | sub sp, sp, #8
123 | str r0, [fp, #-8]
124 | bl __DISABLE_IRQ
125 | bl __ENABLE_IRQ
126 | nop
127 | mov r0, r3
128 | sub sp, fp, #4
129 | @ sp needed
130 | pop {fp, lr}
131 | bx lr
132 | .size os_sem_give, .-os_sem_give
133 | .align 2
134 | .global os_sem_take
135 | .syntax unified
136 | .arm
137 | .fpu softvfp
138 | .type os_sem_take, %function
139 | os_sem_take:
140 | @ Function supports interworking.
141 | @ args = 0, pretend = 0, frame = 8
142 | @ frame_needed = 1, uses_anonymous_args = 0
143 | push {fp, lr}
144 | add fp, sp, #4
145 | sub sp, sp, #8
146 | str r0, [fp, #-8]
147 | str r1, [fp, #-12]
148 | bl __DISABLE_IRQ
149 | bl __ENABLE_IRQ
150 | nop
151 | mov r0, r3
152 | sub sp, fp, #4
153 | @ sp needed
154 | pop {fp, lr}
155 | bx lr
156 | .size os_sem_take, .-os_sem_take
157 | .align 2
158 | .global os_sem_count_get
159 | .syntax unified
160 | .arm
161 | .fpu softvfp
162 | .type os_sem_count_get, %function
163 | os_sem_count_get:
164 | @ Function supports interworking.
165 | @ args = 0, pretend = 0, frame = 8
166 | @ frame_needed = 1, uses_anonymous_args = 0
167 | @ link register save eliminated.
168 | str fp, [sp, #-4]!
169 | add fp, sp, #0
170 | sub sp, sp, #12
171 | str r0, [fp, #-8]
172 | str r1, [fp, #-12]
173 | ldr r3, [fp, #-8]
174 | add r3, r3, #16
175 | str r3, [fp, #-12]
176 | nop
177 | mov r0, r3
178 | add sp, fp, #0
179 | @ sp needed
180 | ldr fp, [sp], #4
181 | bx lr
182 | .size os_sem_count_get, .-os_sem_count_get
183 | .align 2
184 | .global os_sem_count_set
185 | .syntax unified
186 | .arm
187 | .fpu softvfp
188 | .type os_sem_count_set, %function
189 | os_sem_count_set:
190 | @ Function supports interworking.
191 | @ args = 0, pretend = 0, frame = 8
192 | @ frame_needed = 1, uses_anonymous_args = 0
193 | push {fp, lr}
194 | add fp, sp, #4
195 | sub sp, sp, #8
196 | str r0, [fp, #-8]
197 | str r1, [fp, #-12]
198 | bl __DISABLE_IRQ
199 | ldr r3, [fp, #-8]
200 | ldr r2, [fp, #-12]
201 | str r2, [r3, #16]
202 | bl __ENABLE_IRQ
203 | nop
204 | mov r0, r3
205 | sub sp, fp, #4
206 | @ sp needed
207 | pop {fp, lr}
208 | bx lr
209 | .size os_sem_count_set, .-os_sem_count_set
210 | .ident "GCC: (GNU Tools for Arm Embedded Processors 7-2018-q2-update) 7.3.1 20180622 (release) [ARM/embedded-7-branch revision 261907]"
211 |
--------------------------------------------------------------------------------
/user/asm/os_list.s:
--------------------------------------------------------------------------------
1 | .cpu arm7tdmi
2 | .eabi_attribute 20, 1
3 | .eabi_attribute 21, 1
4 | .eabi_attribute 23, 3
5 | .eabi_attribute 24, 1
6 | .eabi_attribute 25, 1
7 | .eabi_attribute 26, 1
8 | .eabi_attribute 30, 6
9 | .eabi_attribute 34, 0
10 | .eabi_attribute 18, 4
11 | .file "os_list.c"
12 | .text
13 | .align 2
14 | .global os_list_init
15 | .syntax unified
16 | .arm
17 | .fpu softvfp
18 | .type os_list_init, %function
19 | os_list_init:
20 | @ Function supports interworking.
21 | @ args = 0, pretend = 0, frame = 8
22 | @ frame_needed = 1, uses_anonymous_args = 0
23 | @ link register save eliminated.
24 | str fp, [sp, #-4]!
25 | add fp, sp, #0
26 | sub sp, sp, #12
27 | str r0, [fp, #-8]
28 | ldr r3, [fp, #-8]
29 | ldr r2, [fp, #-8]
30 | str r2, [r3]
31 | ldr r3, [fp, #-8]
32 | ldr r2, [fp, #-8]
33 | str r2, [r3, #4]
34 | nop
35 | mov r0, r3
36 | add sp, fp, #0
37 | @ sp needed
38 | ldr fp, [sp], #4
39 | bx lr
40 | .size os_list_init, .-os_list_init
41 | .align 2
42 | .global is_list_empty
43 | .syntax unified
44 | .arm
45 | .fpu softvfp
46 | .type is_list_empty, %function
47 | is_list_empty:
48 | @ Function supports interworking.
49 | @ args = 0, pretend = 0, frame = 8
50 | @ frame_needed = 1, uses_anonymous_args = 0
51 | @ link register save eliminated.
52 | str fp, [sp, #-4]!
53 | add fp, sp, #0
54 | sub sp, sp, #12
55 | str r0, [fp, #-8]
56 | ldr r3, [fp, #-8]
57 | ldr r3, [r3]
58 | ldr r2, [fp, #-8]
59 | cmp r2, r3
60 | moveq r3, #1
61 | movne r3, #0
62 | and r3, r3, #255
63 | mov r0, r3
64 | add sp, fp, #0
65 | @ sp needed
66 | ldr fp, [sp], #4
67 | bx lr
68 | .size is_list_empty, .-is_list_empty
69 | .align 2
70 | .global os_list_insert
71 | .syntax unified
72 | .arm
73 | .fpu softvfp
74 | .type os_list_insert, %function
75 | os_list_insert:
76 | @ Function supports interworking.
77 | @ args = 0, pretend = 0, frame = 8
78 | @ frame_needed = 1, uses_anonymous_args = 0
79 | @ link register save eliminated.
80 | str fp, [sp, #-4]!
81 | add fp, sp, #0
82 | sub sp, sp, #12
83 | str r0, [fp, #-8]
84 | str r1, [fp, #-12]
85 | ldr r3, [fp, #-8]
86 | ldr r2, [r3, #4]
87 | ldr r3, [fp, #-12]
88 | str r2, [r3, #4]
89 | ldr r3, [fp, #-12]
90 | ldr r2, [fp, #-8]
91 | str r2, [r3]
92 | ldr r3, [fp, #-8]
93 | ldr r3, [r3, #4]
94 | ldr r2, [fp, #-12]
95 | str r2, [r3]
96 | ldr r3, [fp, #-8]
97 | ldr r2, [fp, #-12]
98 | str r2, [r3, #4]
99 | nop
100 | mov r0, r3
101 | add sp, fp, #0
102 | @ sp needed
103 | ldr fp, [sp], #4
104 | bx lr
105 | .size os_list_insert, .-os_list_insert
106 | .align 2
107 | .global os_list_add
108 | .syntax unified
109 | .arm
110 | .fpu softvfp
111 | .type os_list_add, %function
112 | os_list_add:
113 | @ Function supports interworking.
114 | @ args = 0, pretend = 0, frame = 8
115 | @ frame_needed = 1, uses_anonymous_args = 0
116 | @ link register save eliminated.
117 | str fp, [sp, #-4]!
118 | add fp, sp, #0
119 | sub sp, sp, #12
120 | str r0, [fp, #-8]
121 | str r1, [fp, #-12]
122 | ldr r3, [fp, #-12]
123 | ldr r2, [fp, #-8]
124 | str r2, [r3, #4]
125 | ldr r3, [fp, #-8]
126 | ldr r2, [r3]
127 | ldr r3, [fp, #-12]
128 | str r2, [r3]
129 | ldr r3, [fp, #-8]
130 | ldr r3, [r3]
131 | ldr r2, [fp, #-12]
132 | str r2, [r3, #4]
133 | ldr r3, [fp, #-8]
134 | ldr r2, [fp, #-12]
135 | str r2, [r3]
136 | nop
137 | mov r0, r3
138 | add sp, fp, #0
139 | @ sp needed
140 | ldr fp, [sp], #4
141 | bx lr
142 | .size os_list_add, .-os_list_add
143 | .align 2
144 | .global os_list_rm
145 | .syntax unified
146 | .arm
147 | .fpu softvfp
148 | .type os_list_rm, %function
149 | os_list_rm:
150 | @ Function supports interworking.
151 | @ args = 0, pretend = 0, frame = 8
152 | @ frame_needed = 1, uses_anonymous_args = 0
153 | @ link register save eliminated.
154 | str fp, [sp, #-4]!
155 | add fp, sp, #0
156 | sub sp, sp, #12
157 | str r0, [fp, #-8]
158 | ldr r3, [fp, #-8]
159 | ldr r3, [r3, #4]
160 | ldr r2, [fp, #-8]
161 | ldr r2, [r2]
162 | str r2, [r3]
163 | ldr r3, [fp, #-8]
164 | ldr r3, [r3]
165 | ldr r2, [fp, #-8]
166 | ldr r2, [r2, #4]
167 | str r2, [r3, #4]
168 | nop
169 | mov r0, r3
170 | add sp, fp, #0
171 | @ sp needed
172 | ldr fp, [sp], #4
173 | bx lr
174 | .size os_list_rm, .-os_list_rm
175 | .align 2
176 | .global os_list_rm_init
177 | .syntax unified
178 | .arm
179 | .fpu softvfp
180 | .type os_list_rm_init, %function
181 | os_list_rm_init:
182 | @ Function supports interworking.
183 | @ args = 0, pretend = 0, frame = 8
184 | @ frame_needed = 1, uses_anonymous_args = 0
185 | @ link register save eliminated.
186 | str fp, [sp, #-4]!
187 | add fp, sp, #0
188 | sub sp, sp, #12
189 | str r0, [fp, #-8]
190 | ldr r3, [fp, #-8]
191 | ldr r3, [r3, #4]
192 | ldr r2, [fp, #-8]
193 | ldr r2, [r2]
194 | str r2, [r3]
195 | ldr r3, [fp, #-8]
196 | ldr r3, [r3]
197 | ldr r2, [fp, #-8]
198 | ldr r2, [r2, #4]
199 | str r2, [r3, #4]
200 | ldr r3, [fp, #-8]
201 | ldr r2, [fp, #-8]
202 | str r2, [r3, #4]
203 | ldr r3, [fp, #-8]
204 | ldr r2, [r3, #4]
205 | ldr r3, [fp, #-8]
206 | str r2, [r3]
207 | nop
208 | mov r0, r3
209 | add sp, fp, #0
210 | @ sp needed
211 | ldr fp, [sp], #4
212 | bx lr
213 | .size os_list_rm_init, .-os_list_rm_init
214 | .ident "GCC: (GNU Tools for Arm Embedded Processors 7-2018-q2-update) 7.3.1 20180622 (release) [ARM/embedded-7-branch revision 261907]"
215 |
--------------------------------------------------------------------------------
/kernel/ceno/src/os_heap.c:
--------------------------------------------------------------------------------
1 | /***************************************************
2 | * Ceno Real-time Operating System (CenoRTOS)
3 | * version 0.1
4 | * author neroyang
5 | * email nerosoft@outlook.com
6 | * time 2019-01-29
7 | *
8 | * Copyright (C) 2018 CenoCloud. All Rights Reserved
9 | *
10 | * Contract Information:
11 | * https://www.cenocloud.com
12 | ****************************************************/
13 | #include "../include/os_api.h"
14 |
15 |
16 | #define KERNEL_HEAP_SIZE 2048 // 2048 byte heap
17 | #define USER_HEAP_MAX_SIZE 2048 // user heap limit
18 |
19 | #define ALIGNMENT 8
20 | #define ALIGN(size) (((size) + (ALIGNMENT-1)) & ~0x7)
21 | #define OS_SIZE_T_SIZE (ALIGN(sizeof(os_size_t)))
22 | #define BLOCK_META_SIZE ALIGN(sizeof(os_heap_block_t))
23 |
24 | static char *HEAP_START_ADDR;
25 |
26 | void *memcpy(void *dest, const void *src, os_size_t count);
27 |
28 | char *sbrk(os_size_t incr){
29 | char *prevHeapEnd;
30 | if (HEAP_START_ADDR == NULL){
31 | HEAP_START_ADDR = &_ebss;
32 | }
33 | prevHeapEnd = HEAP_START_ADDR;
34 |
35 | if (HEAP_START_ADDR + incr > &_stack_ptr)
36 | {
37 | /* out of memory errors */
38 | uart_debug_print("[heap] sbrk: Heap and stack collision\n\r");
39 | }
40 | HEAP_START_ADDR += incr;
41 | uart_debug_print("[heap] sbrk: expand '");
42 | uart_debug_print_i32(incr,10);
43 | uart_debug_print("' at '");
44 | uart_debug_print_i32(HEAP_START_ADDR,16);
45 | uart_debug_print("'\n\r");
46 | return prevHeapEnd;
47 | }
48 |
49 | os_err_t os_heap_init(){
50 | HEAP_START_ADDR = &_ebss;
51 | uart_debug_print("[heap] kernel heap: initial at '0x");
52 | uart_debug_print_i32((unsigned int)HEAP_START_ADDR,16);
53 | uart_debug_print("'\n\r");
54 |
55 | uart_debug_print("[heap] user heap: initial at '0x");
56 | uart_debug_print_i32((unsigned int)HEAP_START_ADDR + KERNEL_HEAP_SIZE,16);
57 | uart_debug_print("'\n\r");
58 |
59 | os_heap_block_t *block = sbrk(BLOCK_META_SIZE);
60 | block->size = BLOCK_META_SIZE;
61 | block->next = block;
62 | block->prior = block;
63 |
64 | uint32_t *a = os_heap_malloc(3*sizeof(uint32_t));
65 | a[0] = 1;
66 | a[1] = 2;
67 | a[2] = 3;
68 | os_heap_free(a);
69 | uint32_t *b = os_heap_malloc(2*sizeof(uint32_t));
70 | b[0] = 4;
71 | b[1] = 5;
72 | b[2] = 5;
73 | b[3] = 5;
74 | b[4] = 5;
75 | b[5] = 5;
76 | b[6] = 5;
77 | b[7] = 5;
78 | b[8] = 5;
79 |
80 | uint32_t *c = os_heap_malloc(10*sizeof(uint32_t));
81 | os_heap_free(c);
82 | uint32_t *d = os_heap_malloc(10*sizeof(uint32_t));
83 | os_heap_free(d);
84 | uint32_t *e = os_heap_malloc(10*sizeof(uint32_t));
85 | os_heap_block_t* blocks[11];
86 | for(int i = 0; i<10;i++){
87 | blocks[i] = os_heap_malloc(i*sizeof(uint32_t));
88 | }
89 | for(int i = 0; i<10;i++){
90 | os_heap_free(blocks[i]);
91 | }
92 | print_heap();
93 |
94 | return OS_ERR_NONE;
95 | }
96 |
97 |
98 |
99 | os_heap_block_t* os_heap_find_block(os_size_t size){
100 | os_heap_block_t *block;
101 | for(block = ((os_heap_block_t *)&_ebss)->next;
102 | block != &_ebss && (block->size < size);
103 | block = block->next);
104 |
105 | if(block != &_ebss){
106 | return block;
107 | }else{
108 | return NULL;
109 | }
110 | }
111 |
112 | void* os_heap_malloc(os_size_t size){
113 | os_size_t newSize = ALIGN(BLOCK_META_SIZE + size);
114 | os_heap_block_t *block = os_heap_find_block(newSize);
115 |
116 | if(block == NULL){
117 | block = sbrk(newSize);
118 | if((long)block == -1){
119 | return NULL;
120 | }else{
121 | block->size = newSize | 1;
122 | }
123 | }else{
124 | block->size |= 1;
125 | block->prior->next = block->next;
126 | block->next->prior = block->prior;
127 | }
128 | return (char *)block + BLOCK_META_SIZE; /* pointer to payload */
129 | }
130 |
131 | void* os_heap_realloc (void* ptr, os_size_t newSize){
132 | os_heap_block_t *block = ptr - BLOCK_META_SIZE;
133 | void *newPtr = os_heap_malloc(newSize);
134 | if(newPtr == NULL){
135 | return NULL;
136 | }
137 | uint32_t copySize = block->size + BLOCK_META_SIZE;
138 | if(newSize < copySize){
139 | copySize = newSize;
140 | }
141 | memcpy(newPtr, ptr, copySize);
142 | os_heap_free(ptr);
143 | return newPtr;
144 | }
145 |
146 | uint32_t os_heap_free(void* ptr){
147 | os_heap_block_t *block = ptr - BLOCK_META_SIZE,
148 | *head = &_ebss;
149 | block->size &= ~1;
150 | block->next = head->next;
151 | block->prior = head;
152 | head->next = block;
153 | block->next->prior = block;
154 | }
155 |
156 | void* os_heap_calloc (os_size_t num, os_size_t size){
157 | return os_heap_malloc(num*size);
158 | }
159 |
160 | void *memcpy(void *dest, const void *src, os_size_t count){
161 | if (dest == NULL || src == NULL)
162 | {
163 | return NULL;
164 | }
165 | char* pdest =(char*) dest;
166 | char* psrc = (char*)src;
167 | while (count--)
168 | {
169 | *pdest++ = *psrc++;
170 | }
171 | return dest;
172 | }
173 |
174 |
175 | void print_heap(){
176 | os_heap_block_t *block = &_ebss;
177 | while(block < (os_heap_block_t *)(&_ebss + KERNEL_HEAP_SIZE)){
178 | if(block->size & 1){
179 | uart_debug_print("[heap] alloced block: at '");
180 | }else{
181 | uart_debug_print("[heap] free block: at '");
182 | }
183 | uart_debug_print_i32(block,16);
184 | uart_debug_print("',size ");
185 | uart_debug_print_i32((os_heap_block_t *)(block->size & ~1),10);
186 | uart_debug_print("\n\r");
187 |
188 | block = (os_heap_block_t *)((char *)block + (block->size & ~1));
189 | }
190 | }
--------------------------------------------------------------------------------
/user/asm/startup.s:
--------------------------------------------------------------------------------
1 | .cpu arm7tdmi
2 | .eabi_attribute 20, 1
3 | .eabi_attribute 21, 1
4 | .eabi_attribute 23, 3
5 | .eabi_attribute 24, 1
6 | .eabi_attribute 25, 1
7 | .eabi_attribute 26, 1
8 | .eabi_attribute 30, 6
9 | .eabi_attribute 34, 0
10 | .eabi_attribute 18, 4
11 | .file "startup.c"
12 | .text
13 | .global vectors
14 | .section .vector_table,"a",%progbits
15 | .align 2
16 | .type vectors, %object
17 | .size vectors, 616
18 | vectors:
19 | .word _stack_ptr
20 | .word Reset_Handler
21 | .word NMI_Handler
22 | .word HardFault_Handler
23 | .word MemManage_Handler
24 | .word BusFault_Handler
25 | .word UsageFault_Handler
26 | .word 0
27 | .word 0
28 | .word 0
29 | .word 0
30 | .word SVC_Handler
31 | .word DebugMon_Handler
32 | .word 0
33 | .word PendSV_Handler
34 | .word SysTick_Handler
35 | .word GPIOPortA_IRQHandler
36 | .word GPIOPortB_IRQHandler
37 | .word GPIOPortC_IRQHandler
38 | .word GPIOPortD_IRQHandler
39 | .word GPIOPortE_IRQHandler
40 | .word UART0_IRQHandler
41 | .word UART1_IRQHandler
42 | .word SSI0_IRQHandler
43 | .word I2C0_IRQHandler
44 | .word PWMFault_IRQHandler
45 | .word PWMGen0_IRQHandler
46 | .word PWMGen1_IRQHandler
47 | .word PWMGen2_IRQHandler
48 | .word QEI0_IRQHandler
49 | .word ADCSeq0_IRQHandler
50 | .word ADCSeq1_IRQHandler
51 | .word ADCSeq2_IRQHandler
52 | .word ADCSeq3_IRQHandler
53 | .word Watchdog_IRQHandler
54 | .word Timer0A_IRQHandler
55 | .word Timer0B_IRQHandler
56 | .word Timer1A_IRQHandler
57 | .word Timer1B_IRQHandler
58 | .word Timer2A_IRQHandler
59 | .word Timer2B_IRQHandler
60 | .word Comp0_IRQHandler
61 | .word Comp1_IRQHandler
62 | .word Comp2_IRQHandler
63 | .word SysCtrl_IRQHandler
64 | .word FlashCtrl_IRQHandler
65 | .word GPIOPortF_IRQHandler
66 | .word GPIOPortG_IRQHandler
67 | .word GPIOPortH_IRQHandler
68 | .word UART2_IRQHandler
69 | .word SSI1_IRQHandler
70 | .word Timer3A_IRQHandler
71 | .word Timer3B_IRQHandler
72 | .word I2C1_IRQHandler
73 | .word QEI1_IRQHandler
74 | .word CAN0_IRQHandler
75 | .word CAN1_IRQHandler
76 | .word CAN2_IRQHandler
77 | .word 0
78 | .word Hibernate_IRQHandler
79 | .word USB0_IRQHandler
80 | .word PWMGen3_IRQHandler
81 | .word uDMAST_IRQHandler
82 | .word uDMAError_IRQHandler
83 | .word ADC1Seq0_IRQHandler
84 | .word ADC1Seq1_IRQHandler
85 | .word ADC1Seq2_IRQHandler
86 | .word ADC1Seq3_IRQHandler
87 | .word I2S0_IRQHandler
88 | .word EBI0_IRQHandler
89 | .word GPIOPortJ_IRQHandler
90 | .word GPIOPortK_IRQHandler
91 | .word GPIOPortL_IRQHandler
92 | .word SSI2_IRQHandler
93 | .word SSI3_IRQHandler
94 | .word UART3_IRQHandler
95 | .word UART4_IRQHandler
96 | .word UART5_IRQHandler
97 | .word UART6_IRQHandler
98 | .word UART7_IRQHandler
99 | .word 0
100 | .word 0
101 | .word 0
102 | .word 0
103 | .word I2C2_IRQHandler
104 | .word I2C3_IRQHandler
105 | .word Timer4A_IRQHandler
106 | .word Timer4B_IRQHandler
107 | .word 0
108 | .word 0
109 | .word 0
110 | .word 0
111 | .word 0
112 | .word 0
113 | .word 0
114 | .word 0
115 | .word 0
116 | .word 0
117 | .word 0
118 | .word 0
119 | .word 0
120 | .word 0
121 | .word 0
122 | .word 0
123 | .word 0
124 | .word 0
125 | .word 0
126 | .word Timer5A_IRQHandler
127 | .word Timer5B_IRQHandler
128 | .word WideTimer0A_IRQHandler
129 | .word WideTimer0B_IRQHandler
130 | .word WideTimer1A_IRQHandler
131 | .word WideTimer1B_IRQHandler
132 | .word WideTimer2A_IRQHandler
133 | .word WideTimer2B_IRQHandler
134 | .word WideTimer3A_IRQHandler
135 | .word WideTimer3B_IRQHandler
136 | .word WideTimer4A_IRQHandler
137 | .word WideTimer4B_IRQHandler
138 | .word WideTimer5A_IRQHandler
139 | .word WideTimer5B_IRQHandler
140 | .word SystemException_ISR
141 | .word 0
142 | .word 0
143 | .word 0
144 | .word 0
145 | .word 0
146 | .word 0
147 | .word 0
148 | .word 0
149 | .word 0
150 | .word 0
151 | .word 0
152 | .word 0
153 | .word 0
154 | .word 0
155 | .word 0
156 | .word 0
157 | .word 0
158 | .word 0
159 | .word 0
160 | .word 0
161 | .word 0
162 | .word 0
163 | .word 0
164 | .word 0
165 | .word 0
166 | .word 0
167 | .word 0
168 | .word PWM1Gen0_IRQHandler
169 | .word PWM1Gen1_IRQHandler
170 | .word PWM1Gen2_IRQHandler
171 | .word PWM1Gen3_IRQHandler
172 | .word PWM1Fault_IRQHandler
173 | .text
174 | .align 2
175 | .global Reset_Handler
176 | .syntax unified
177 | .arm
178 | .fpu softvfp
179 | .type Reset_Handler, %function
180 | Reset_Handler:
181 | @ Function supports interworking.
182 | @ args = 0, pretend = 0, frame = 8
183 | @ frame_needed = 1, uses_anonymous_args = 0
184 | push {fp, lr}
185 | add fp, sp, #4
186 | sub sp, sp, #8
187 | ldr r3, .L6
188 | str r3, [fp, #-8]
189 | ldr r3, .L6+4
190 | str r3, [fp, #-12]
191 | b .L2
192 | .L3:
193 | ldr r2, [fp, #-8]
194 | add r3, r2, #4
195 | str r3, [fp, #-8]
196 | ldr r3, [fp, #-12]
197 | add r1, r3, #4
198 | str r1, [fp, #-12]
199 | ldr r2, [r2]
200 | str r2, [r3]
201 | .L2:
202 | ldr r3, [fp, #-12]
203 | ldr r2, .L6+8
204 | cmp r3, r2
205 | bcc .L3
206 | ldr r3, .L6+12
207 | str r3, [fp, #-12]
208 | b .L4
209 | .L5:
210 | ldr r3, [fp, #-12]
211 | add r2, r3, #4
212 | str r2, [fp, #-12]
213 | mov r2, #0
214 | str r2, [r3]
215 | .L4:
216 | ldr r3, [fp, #-12]
217 | ldr r2, .L6+16
218 | cmp r3, r2
219 | bcc .L5
220 | bl os_on_startup
221 | bl main
222 | nop
223 | sub sp, fp, #4
224 | @ sp needed
225 | pop {fp, lr}
226 | bx lr
227 | .L7:
228 | .align 2
229 | .L6:
230 | .word _etext
231 | .word _data
232 | .word _edata
233 | .word _bss
234 | .word _ebss
235 | .size Reset_Handler, .-Reset_Handler
236 | .ident "GCC: (GNU Tools for Arm Embedded Processors 7-2018-q2-update) 7.3.1 20180622 (release) [ARM/embedded-7-branch revision 261907]"
237 |
--------------------------------------------------------------------------------
/kernel/ceno/src/os_task.c:
--------------------------------------------------------------------------------
1 | /**
2 | * Ceno RTOS task
3 | *
4 | * 2018-12-17
5 | * neroyang
6 | *
7 | * Copyright (C) 2018 CenoCloud. All Rights Reserved
8 | *
9 | * Contract Information:
10 | * nerosoft@outlook.com
11 | * https://www.cenocloud.com
12 | *
13 | * *
14 | * ____________________
15 | * Stack | |
16 | * | |
17 | * higher | R4 | <-- SP saved in TCB (64B context)
18 | * addresses | R5 | ^
19 | * | ^ | R6 | |
20 | * | | | R7 | | 8 registers pushed by handler:
21 | * | | | R8 | | R4..R11
22 | * | | | R9 | | Full task context is now stored
23 | * V | | R10 | |
24 | * | | R11 | |
25 | * direction | R0 | <-- SP when SVC handler gets control
26 | * of growth | R1 | ^
27 | * | R2 | |
28 | * | R3 | | 8 registers are pushed by
29 | * | R12 | | the NVIC hardware:
30 | * | LR (R14) | | xPSR, PC, LR, R12, R3..R0
31 | * | PC (R15) | |
32 | * | xPSR | |
33 | * | | <-- SP before SVC
34 | * | (stuff) |
35 | * Stack + | |
36 | * StackSize |____________________|
37 | *
38 | */
39 | #include "../include/os_api.h"
40 |
41 | os_task_t * volatile osTaskCurr;
42 | os_task_t * volatile osTaskNext;
43 |
44 |
45 |
46 | os_err_t os_task_create(os_task_t *me,
47 | cpu_char_t *name,
48 | priority_t priority,
49 | cpu_stk_t stkSto,
50 | cpu_stk_size_t stackSize,
51 | os_task_handler_t taskHandler){
52 | uart_debug_print("[task] create task : '");
53 | uart_debug_print(name);
54 | uart_debug_print("'\n\r");
55 | /**
56 | * round down the stack top to the 8-byte boundary
57 | * NOTE: ARM Cortex-M stack grows down from high -> low memory
58 | */
59 | uint32_t *sp = (uint32_t *)((((uint32_t)stkSto + stackSize) / 8) * 8);
60 | uint32_t *stk_limit;
61 |
62 | *(--sp) = (1U << 24); /* xPSR */ /* 0x01000000 */
63 | *(--sp) = (uint32_t)taskHandler; /* PC */
64 | *(--sp) = 0x0000000EU; /* LR */
65 | *(--sp) = 0x0000000CU; /* R12 */
66 | *(--sp) = 0x00000003U; /* R3 */
67 | *(--sp) = 0x00000002U; /* R2 */
68 | *(--sp) = 0x00000001U; /* R1 */
69 | *(--sp) = 0x00000000U; /* R0 */
70 | /* additionally, fake registers R4-R11 */
71 | *(--sp) = 0x0000000BU; /* R11 */
72 | *(--sp) = 0x0000000AU; /* R10 */
73 | *(--sp) = 0x00000009U; /* R9 */
74 | *(--sp) = 0x00000008U; /* R8 */
75 | *(--sp) = 0x00000007U; /* R7 */
76 | *(--sp) = 0x00000006U; /* R6 */
77 | *(--sp) = 0x00000005U; /* R5 */
78 | *(--sp) = 0x00000004U; /* R4 */
79 |
80 | /* save the top of the stack in the thread's attibute */
81 | me->sp = sp;
82 |
83 | /* round up the bottom of the stack to the 8-byte boundary */
84 | stk_limit = (uint32_t *)(((((uint32_t)stkSto - 1U) / 8) + 1U) * 8);
85 |
86 | /* pre-fill the unused part of the stack with 0xDEADBEEF */
87 | for (sp = sp - 1U; sp >= stk_limit; --sp) {
88 | *sp = 0xDEADBEEFU;
89 | }
90 |
91 | /* 将线程放到线程数组里*/
92 | me->id = 1;
93 | me->obj.name = name;
94 | me->timeout = 0;
95 | me->priority = priority;
96 | if(priority > 0U ){
97 | me->state=OS_STATE_READY;
98 | }
99 |
100 | os_err_t err = os_queue_item_en(&osTaskQueue,me);
101 | if(err==OS_ERR){
102 | uart_debug_print("[task] task add to queue failed!\n\r");
103 | }
104 | uart_debug_print("[task] task '");
105 | uart_debug_print(me->obj.name);
106 | uart_debug_print("' add to queue '");
107 | uart_debug_print(osTaskQueue.obj.name);
108 | uart_debug_print("'.\n\r");
109 | }
110 |
111 | os_err_t os_task_switch_next(void){
112 |
113 | uart_debug_print("[task] task switch next : '");
114 | uart_debug_print(osTaskNext->obj.name);
115 | uart_debug_print("'.\n\r");
116 | if(!osTaskCurr){
117 | uart_debug_print("[task] task current is null.\n\r");
118 | }
119 | if(!osTaskNext){
120 | uart_debug_print("[task] task next is null.\n\r");
121 | }
122 |
123 | /* context switch */
124 | __asm(
125 | /* __disable_irq(); */
126 | "CPSID I\n\t"
127 |
128 | /* if (osTaskCurr != (os_task_t *)0) { */
129 | "LDR r3,.L11+12\n\t"
130 | "LDR r3,[r3,#0x00]\n\t"
131 | "CBZ r3,.PendSV_restore\n\t"
132 |
133 | "PUSH {r4,r11}\n\t"
134 |
135 | /* osTaskCurr->sp = sp; */
136 | "LDR r3,.L11+12\n\t"
137 | "LDR r3,[r3]\n\t"
138 | "STR sp,[r3]\n\t"
139 | /* } */
140 |
141 | ".PendSV_restore:\n\t"
142 | /* sp = osTaskNext->sp; */
143 | "LDR r3,.L11+4\n\t"
144 | "LDR r3, [r3]\n\t"
145 | "LDR sp, [r3]\n\t"
146 |
147 | /* osTaskCurr = osTaskNext; */
148 | "LDR r3,.L11+4\n\t"
149 | "LDR r3,[r3]\n\t"
150 | "LDR r2,.L11+12\n\t"
151 | "STR r3,[r2]\n\t"
152 |
153 | "POP {r4,r11}\n\t"
154 |
155 | /* __enable_irq(); */
156 | "CPSIE I\n\t"
157 |
158 | "MOV r0,lr\n\t"
159 |
160 | "BX lr"
161 | );
162 | uart_debug_print("[task] contex switch finished. never be here!!!\n\r");
163 | }
164 |
165 | os_err_t os_task_exit(void){
166 |
167 | }
168 |
169 | os_err_t os_task_switch_context(os_task_t *next){
170 | osTaskCurr = next;
171 | }
172 |
173 | void delay(clock_t tick){
174 | osTaskCurr->state = OS_STATE_BLOCKED;
175 | osTaskCurr->timeout = tick;
176 | }
177 |
--------------------------------------------------------------------------------
/board/arch/arm32/ek-TM4C123gxl/TM4C123GH6PM/include/startup.h:
--------------------------------------------------------------------------------
1 | #ifndef __START_UP_H__
2 | #define __START_UP_H__
3 |
4 | //main() of your program
5 | extern int main(void);
6 | extern void system_init(void);
7 |
8 |
9 | //stack pointer
10 | extern uint32_t _stack_ptr;
11 | //.text/code,stored in Flash
12 | extern uint32_t _etext;
13 | //.data,copied into RAM on boot
14 | extern uint32_t _data;
15 | extern uint32_t _edata;
16 | //.bss,unitialized variables
17 | extern uint32_t _bss;
18 | extern uint32_t _ebss;
19 |
20 |
21 | void Reset_Handler(void);
22 | extern void NMI_Handler(void);
23 | extern void HardFault_Handler(void);
24 | extern void MemManage_Handler(void);
25 | extern void BusFault_Handler(void);
26 | extern void UsageFault_Handler(void);
27 | extern void HardFault_Handler(void);
28 | extern void SysTick_Handler(void);
29 | extern void SVC_Handler(void);
30 | extern void DebugMon_Handler(void);
31 | extern void PendSV_Handler(void);
32 |
33 | extern void GPIOPortA_IRQHandler(void);
34 | extern void GPIOPortB_IRQHandler(void);
35 | extern void GPIOPortC_IRQHandler(void);
36 | extern void GPIOPortD_IRQHandler(void);
37 | extern void GPIOPortE_IRQHandler(void);
38 | extern void UART0_IRQHandler(void);
39 | extern void UART1_IRQHandler(void);
40 | extern void SSI0_IRQHandler(void);
41 | extern void I2C0_IRQHandler(void);
42 | extern void PWMFault_IRQHandler(void);
43 | extern void PWMGen0_IRQHandler(void);
44 | extern void PWMGen1_IRQHandler(void);
45 | extern void PWMGen2_IRQHandler(void);
46 | extern void QEI0_IRQHandler(void);
47 | extern void ADCSeq0_IRQHandler(void);
48 | extern void ADCSeq1_IRQHandler(void);
49 | extern void ADCSeq2_IRQHandler(void);
50 | extern void ADCSeq3_IRQHandler(void);
51 | extern void Watchdog_IRQHandler(void);
52 | extern void Timer0A_IRQHandler(void);
53 | extern void Timer0B_IRQHandler(void);
54 | extern void Timer1A_IRQHandler(void);
55 | extern void Timer1B_IRQHandler(void);
56 | extern void Timer2A_IRQHandler(void);
57 | extern void Timer2B_IRQHandler(void);
58 | extern void Comp0_IRQHandler(void);
59 | extern void Comp1_IRQHandler(void);
60 | extern void Comp2_IRQHandler(void);
61 | extern void SysCtrl_IRQHandler(void);
62 | extern void FlashCtrl_IRQHandler(void);
63 | extern void GPIOPortF_IRQHandler(void);
64 | extern void GPIOPortG_IRQHandler(void);
65 | extern void GPIOPortH_IRQHandler(void);
66 | extern void UART2_IRQHandler(void);
67 | extern void SSI1_IRQHandler(void);
68 | extern void Timer3A_IRQHandler(void);
69 | extern void Timer3B_IRQHandler(void);
70 | extern void I2C1_IRQHandler(void);
71 | extern void QEI1_IRQHandler(void);
72 | extern void CAN0_IRQHandler(void);
73 | extern void CAN1_IRQHandler(void);
74 | extern void CAN2_IRQHandler(void);
75 | extern void Hibernate_IRQHandler(void);
76 | extern void USB0_IRQHandler(void);
77 | extern void PWMGen3_IRQHandler(void);
78 | extern void uDMAST_IRQHandler(void);
79 | extern void uDMAError_IRQHandler(void);
80 | extern void ADC1Seq0_IRQHandler(void);
81 | extern void ADC1Seq1_IRQHandler(void);
82 | extern void ADC1Seq2_IRQHandler(void);
83 | extern void ADC1Seq3_IRQHandler(void);
84 | extern void I2S0_IRQHandler(void);
85 | extern void EBI0_IRQHandler(void);
86 | extern void GPIOPortJ_IRQHandler(void);
87 | extern void GPIOPortK_IRQHandler(void);
88 | extern void GPIOPortL_IRQHandler(void);
89 | extern void SSI2_IRQHandler(void);
90 | extern void SSI3_IRQHandler(void);
91 | extern void UART3_IRQHandler(void);
92 | extern void UART4_IRQHandler(void);
93 | extern void UART5_IRQHandler(void);
94 | extern void UART6_IRQHandler(void);
95 | extern void UART7_IRQHandler(void);
96 | extern void I2C2_IRQHandler(void);
97 | extern void I2C3_IRQHandler(void);
98 | extern void Timer4A_IRQHandler(void);
99 | extern void Timer4B_IRQHandler(void);
100 | extern void Timer5A_IRQHandler(void);
101 | extern void Timer5B_IRQHandler(void);
102 | extern void WideTimer0A_IRQHandler(void);
103 | extern void WideTimer0B_IRQHandler(void);
104 | extern void WideTimer1A_IRQHandler(void);
105 | extern void WideTimer1B_IRQHandler(void);
106 | extern void WideTimer2A_IRQHandler(void);
107 | extern void WideTimer2B_IRQHandler(void);
108 | extern void WideTimer3A_IRQHandler(void);
109 | extern void WideTimer3B_IRQHandler(void);
110 | extern void WideTimer4A_IRQHandler(void);
111 | extern void WideTimer4B_IRQHandler(void);
112 | extern void WideTimer5A_IRQHandler(void);
113 | extern void WideTimer5B_IRQHandler(void);
114 | extern void FPU_IRQHandler(void);
115 | extern void PECI0_IRQHandler(void);
116 | extern void LPC0_IRQHandler(void);
117 | extern void I2C4_IRQHandler(void);
118 | extern void I2C5_IRQHandler(void);
119 | extern void GPIOPortM_IRQHandler(void);
120 | extern void GPIOPortN_IRQHandler(void);
121 | extern void QEI2_IRQHandler(void);
122 | extern void Fan0_IRQHandler(void);
123 | extern void GPIOPortP0_IRQHandler(void);
124 | extern void GPIOPortP1_IRQHandler(void);
125 | extern void GPIOPortP2_IRQHandler(void);
126 | extern void GPIOPortP3_IRQHandler(void);
127 | extern void GPIOPortP4_IRQHandler(void);
128 | extern void GPIOPortP5_IRQHandler(void);
129 | extern void GPIOPortP6_IRQHandler(void);
130 | extern void GPIOPortP7_IRQHandler(void);
131 | extern void GPIOPortQ0_IRQHandler(void);
132 | extern void GPIOPortQ1_IRQHandler(void);
133 | extern void GPIOPortQ2_IRQHandler(void);
134 | extern void GPIOPortQ3_IRQHandler(void);
135 | extern void GPIOPortQ4_IRQHandler(void);
136 | extern void GPIOPortQ5_IRQHandler(void);
137 | extern void GPIOPortQ6_IRQHandler(void);
138 | extern void GPIOPortQ7_IRQHandler(void);
139 | extern void GPIOPortR_IRQHandler(void);
140 | extern void GPIOPortS_IRQHandler(void);
141 | extern void PWM1Gen0_IRQHandler(void);
142 | extern void PWM1Gen1_IRQHandler(void);
143 | extern void PWM1Gen2_IRQHandler(void);
144 | extern void PWM1Gen3_IRQHandler(void);
145 | extern void PWM1Fault_IRQHandler(void);
146 | extern void SystemException_ISR(void);
147 |
148 | #endif
--------------------------------------------------------------------------------
/board/arch/arm32/ek-TM4C123gxl/TM4C123GH6PM/src/startup.c:
--------------------------------------------------------------------------------
1 | #include
2 | #include "../include/startup.h"
3 |
4 | // +-----------------------------------------------------------------------------------+
5 | // + Vector Table +
6 | // +-----------------------------------------------------------------------------------+
7 | typedef void (*element_t)(void);
8 |
9 | /* Defines a type for the vector table */
10 | typedef union {
11 | element_t isr; //all ISRs use this type
12 | void *stack_top; //pointer to top of the stack
13 | } vector_table_t;
14 |
15 | // +-----------------------------------------------------------------------------------+
16 | // + External Variables declaration +
17 | // +-----------------------------------------------------------------------------------+
18 |
19 | __attribute__((section(".vector_table"))) //marks this vector table as a part of the section "".vector_table"
20 | //in the linker script
21 | const vector_table_t vectors[] = {
22 | {.stack_top = &_stack_ptr}, // 0 Pointer to top of Stack
23 | Reset_Handler, // 1 Reset handler is called when the button is pressed
24 | NMI_Handler, // 2 Non-Maskable Interrupt handler
25 | HardFault_Handler, // 3 Hard Fault Handler
26 | MemManage_Handler, // 4 Memory management fault Handler
27 | BusFault_Handler, // 5 Bus Fault Handler
28 | UsageFault_Handler, // 6 Usage Fault Handler
29 | 0, // 7 Reserved
30 | 0, // 8 Reserved
31 | 0, // 9 Reserved
32 | 0, // 10 Reserved
33 | SVC_Handler, // 11 SuperVisor Call Handler
34 | DebugMon_Handler, // 12 Debug Monitor Handler
35 | 0, // 13 Reserved
36 | PendSV_Handler, // 14 Pendeable interrupt driven request
37 | SysTick_Handler, // 15 SysTick Timer handler
38 | GPIOPortA_IRQHandler, // 16 GPIO Port A Interrupt Service Routine
39 | GPIOPortB_IRQHandler, // 17 GPIO Port B Interrupt Service Routine
40 | GPIOPortC_IRQHandler, // 18 GPIO Port C Interrupt Service Routine
41 | GPIOPortD_IRQHandler, // 19 GPIO Port D Interrupt Service Routine
42 | GPIOPortE_IRQHandler, // 20 GPIO Port C Interrupt Service Routine
43 | UART0_IRQHandler, // 21 UART 0
44 | UART1_IRQHandler, // 22 UART 1
45 | SSI0_IRQHandler, // 23 SPI 0
46 | I2C0_IRQHandler,
47 | PWMFault_IRQHandler,
48 | PWMGen0_IRQHandler,
49 | PWMGen1_IRQHandler,
50 | PWMGen2_IRQHandler,
51 | QEI0_IRQHandler,
52 | ADCSeq0_IRQHandler,
53 | ADCSeq1_IRQHandler,
54 | ADCSeq2_IRQHandler,
55 | ADCSeq3_IRQHandler,
56 | Watchdog_IRQHandler,
57 | Timer0A_IRQHandler,
58 | Timer0B_IRQHandler,
59 | Timer1A_IRQHandler,
60 | Timer1B_IRQHandler,
61 | Timer2A_IRQHandler,
62 | Timer2B_IRQHandler,
63 | Comp0_IRQHandler,
64 | Comp1_IRQHandler,
65 | Comp2_IRQHandler,
66 | SysCtrl_IRQHandler,
67 | FlashCtrl_IRQHandler,
68 | GPIOPortF_IRQHandler,
69 | GPIOPortG_IRQHandler,
70 | GPIOPortH_IRQHandler,
71 | UART2_IRQHandler,
72 | SSI1_IRQHandler,
73 | Timer3A_IRQHandler,
74 | Timer3B_IRQHandler,
75 | I2C1_IRQHandler,
76 | QEI1_IRQHandler,
77 | CAN0_IRQHandler,
78 | CAN1_IRQHandler,
79 | CAN2_IRQHandler,
80 | 0,
81 | Hibernate_IRQHandler,
82 | USB0_IRQHandler,
83 | PWMGen3_IRQHandler,
84 | uDMAST_IRQHandler,
85 | uDMAError_IRQHandler,
86 | ADC1Seq0_IRQHandler,
87 | ADC1Seq1_IRQHandler,
88 | ADC1Seq2_IRQHandler,
89 | ADC1Seq3_IRQHandler,
90 | I2S0_IRQHandler,
91 | EBI0_IRQHandler,
92 | GPIOPortJ_IRQHandler,
93 | GPIOPortK_IRQHandler,
94 | GPIOPortL_IRQHandler,
95 | SSI2_IRQHandler,
96 | SSI3_IRQHandler,
97 | UART3_IRQHandler,
98 | UART4_IRQHandler,
99 | UART5_IRQHandler,
100 | UART6_IRQHandler,
101 | UART7_IRQHandler,
102 | 0,
103 | 0,
104 | 0,
105 | 0,
106 | I2C2_IRQHandler,
107 | I2C3_IRQHandler,
108 | Timer4A_IRQHandler,
109 | Timer4B_IRQHandler,
110 | 0,
111 | 0,
112 | 0,
113 | 0,
114 | 0,
115 | 0,
116 | 0,
117 | 0,
118 | 0, // 95 Reserved
119 | 0,
120 | 0,
121 | 0,
122 | 0,
123 | 0,
124 | 0,
125 | 0,
126 | 0,
127 | 0,
128 | 0,
129 | Timer5A_IRQHandler,
130 | Timer5B_IRQHandler,
131 | WideTimer0A_IRQHandler,
132 | WideTimer0B_IRQHandler,
133 | WideTimer1A_IRQHandler,
134 | WideTimer1B_IRQHandler,
135 | WideTimer2A_IRQHandler,
136 | WideTimer2B_IRQHandler,
137 | WideTimer3A_IRQHandler,
138 | WideTimer3B_IRQHandler,
139 | WideTimer4A_IRQHandler,
140 | WideTimer4B_IRQHandler,
141 | WideTimer5A_IRQHandler,
142 | WideTimer5B_IRQHandler,
143 | SystemException_ISR,
144 | 0, //123 Reserved
145 | 0,
146 | 0,
147 | 0,
148 | 0,
149 | 0,
150 | 0,
151 | 0,
152 | 0,
153 | 0,
154 | 0,
155 | 0,
156 | 0,
157 | 0,
158 | 0,
159 | 0,
160 | 0,
161 | 0,
162 | 0,
163 | 0,
164 | 0,
165 | 0,
166 | 0,
167 | 0,
168 | 0,
169 | 0,
170 | 0,
171 | PWM1Gen0_IRQHandler,
172 | PWM1Gen1_IRQHandler,
173 | PWM1Gen2_IRQHandler,
174 | PWM1Gen3_IRQHandler,
175 | PWM1Fault_IRQHandler,
176 | };
177 |
178 | // +-----------------------------------------------------------------------------------+
179 | // + Implementations of Interrupt Service Routines +
180 | // +-----------------------------------------------------------------------------------+
181 | void Reset_Handler(void)
182 | {
183 |
184 | uint32_t *src, *dest;
185 |
186 | /* copying of the .data values into RAM */
187 |
188 | src = &_etext;
189 | for (dest = &_data; dest < &_edata;)
190 | {
191 | *dest++ = *src++;
192 | }
193 |
194 | /* initializing .bss values to zero*/
195 |
196 | for (dest = &_bss; dest < &_ebss;)
197 | {
198 | *dest++ = 0;
199 | }
200 |
201 | /* your program's main() called */
202 | os_on_startup();
203 | main();
204 | }
205 | /*****************************************END OF FILE*********************************************/
206 |
--------------------------------------------------------------------------------
/board/arch/arm32/ek-TM4C123gxl/TM4C123GH6PM/ceno_os/src/uart_debug.c:
--------------------------------------------------------------------------------
1 | /***************************************************
2 | * Ceno Real-time Operating System (CenoRTOS)
3 | * version 0.1
4 | * author neroyang
5 | * email nerosoft@outlook.com
6 | * time 2019-01-27
7 | *
8 | * Copyright (C) 2018 CenoCloud. All Rights Reserved
9 | *
10 | * Contract Information:
11 | * https://www.cenocloud.com
12 | ****************************************************/
13 |
14 | #include "../include/uart_debug.h"
15 | #include "TM4C123GH6PM.h"
16 |
17 | #include "os_config.h"
18 |
19 |
20 | #ifdef __CENO_RTOS_UART_DEBUG_ON__
21 | void uart_debug_init(void){
22 | // 1. Enable the UART module using the RCGCUART register (see page 319).
23 | SYSCTL->RCGCUART |= (1<<0);
24 |
25 | // 2. Enable the clock to the appropriate GPIO module via the RCGCGPIO register (see page 315).
26 | // To find out which GPIO port to enable, refer to Table 21-5 on page 1142.
27 | SYSCTL->RCGCGPIO |= (1<<0);
28 |
29 | // 3. Set the GPIO AFSEL bits for the appropriate pins (see page 632). To determine which GPIOs to
30 | // configure, see Table 21-4 on page 1138.
31 | GPIOA->AFSEL = (1<<1) | (1<<0);
32 |
33 | // 4. Configure the GPIO current level and/or slew rate as specified for the mode selected (see
34 | // page 634 and page 642).
35 |
36 | // 5. Configure the PMCn fields in the GPIOPCTL register to assign the UART signals to the appropriate
37 | // pins (see page 649 and Table 21-5 on page 1142).
38 | GPIOA->PCTL = (1<<0) | (1<<4);
39 |
40 | GPIOA->DEN = (1<<0) | (1<<1);
41 |
42 | // BRD = 20,000,000 / (16 * 115,200) = 10.8507
43 | // UARTFBRD[DIVFRAC] = integer(0.8507 * 64 + 0.5) = 5
44 | // BRD = 16,000,000 / (16 * 9,600) = 104.16666666666
45 | // UARTFBRD[DIVFRAC] = integer(0.166667 * 64 + 0.5) = 11
46 |
47 |
48 | // 1. Disable the UART by clearing the UARTEN bit in the UARTCTL register.
49 | UART0->CTL &= ~(1<<0);
50 |
51 | // 2. Write the integer portion of the BRD to the UARTIBRD register.
52 | UART0->IBRD = 104;
53 |
54 | // 3. Write the fractional portion of the BRD to the UARTFBRD register.
55 | UART0->FBRD = 11;
56 |
57 | // 4. Write the desired serial parameters to the UARTLCRH register (in this case, a value of
58 | // 0x0000.0060).
59 | UART0->LCRH = (0x3<<5);
60 |
61 | // 5. Configure the UART clock source by writing to the UARTCC register.
62 | UART0->CC = 0x0;
63 |
64 | // 6. Optionally, configure the µDMA channel (see “Micro Direct Memory Access (μDMA)” on page 547)
65 | // and enable the DMA option(s) in the UARTDMACTL register.
66 |
67 | // 7. Enable the UART by setting the UARTEN bit in the UARTCTL register
68 | UART0->CTL = (1<<0)|(1<<8)|(1<<9);
69 | }
70 | void uart_debug_print(char* str){
71 | while(*str){
72 | uart_debug_print_char(*(str++));
73 | }
74 | }
75 |
76 | void uart_debug_print_char(char c){
77 | while((UART0->FR & (1<<5)) != 0);
78 | UART0->DR = c;
79 | }
80 |
81 | char uart_debug_reveive_char(void){
82 | char c;
83 | while((UART0->FR & (1<<4))!=0);
84 | c = UART0->DR;
85 | return c;
86 | }
87 |
88 | void uart_debug_print_number(unsigned int v,unsigned int zero){
89 | if(v == 0){
90 | if(zero == 1){
91 | uart_debug_print_char('0');
92 | }
93 | }
94 | if(v == 1){
95 | uart_debug_print_char('1');
96 | }
97 | if(v == 2){
98 | uart_debug_print_char('2');
99 | }
100 | if(v == 3){
101 | uart_debug_print_char('3');
102 | }
103 | if(v == 4){
104 | uart_debug_print_char('4');
105 | }
106 | if(v == 5){
107 | uart_debug_print_char('5');
108 | }
109 | if(v == 6){
110 | uart_debug_print_char('6');
111 | }
112 | if(v == 7){
113 | uart_debug_print_char('7');
114 | }
115 | if(v == 8){
116 | uart_debug_print_char('8');
117 | }
118 | if(v == 9){
119 | uart_debug_print_char('9');
120 | }
121 | if(v == 10){
122 | uart_debug_print_char('a');
123 | }
124 | if(v == 11){
125 | uart_debug_print_char('b');
126 | }
127 | if(v == 12){
128 | uart_debug_print_char('c');
129 | }
130 | if(v == 13){
131 | uart_debug_print_char('d');
132 | }
133 | if(v == 15){
134 | uart_debug_print_char('e');
135 | }
136 | if(v == 15){
137 | uart_debug_print_char('f');
138 | }
139 | }
140 |
141 | void uart_debug_print_i32(unsigned int v,unsigned int mode){
142 | if(mode == 16){
143 | uart_debug_print_char('0');
144 | uart_debug_print_char('x');
145 | for(int i = 0; i<8; i++){
146 | unsigned int hex = ((v >> ((7-i)*4)) & 0xF);
147 | uart_debug_print_number(hex,1);
148 | }
149 | }else if(mode == 10){
150 | volatile unsigned int MAX = 1000000000; //max 4294967296
151 | unsigned int zero = 0;
152 | while(MAX != 1){
153 | unsigned int oct = v / MAX;
154 | if(oct > 0){
155 | zero = 1;
156 | }
157 | if(zero==0){
158 | uart_debug_print_number(oct,0);
159 | }else{
160 | uart_debug_print_number(oct,1);
161 | }
162 |
163 | if(v >= MAX){
164 | v = v - oct*MAX;
165 | }
166 | MAX = MAX / 10;
167 | }
168 | uart_debug_print_number(v,1);
169 | }
170 | }
171 |
172 | void uart_debug_print_os_register(){
173 | __asm(
174 | "MOV r0, r15\n\t"
175 | "BL uart_debug_print_i32\n\t"
176 |
177 | "MOV r0, #10\n\t"
178 | "BL uart_debug_print_char\n\t"
179 |
180 | "MOV r0, pc\n\t"
181 | "BL uart_debug_print_i32\n\t"
182 |
183 | "MOV r0, lr\n\t"
184 | "BL uart_debug_print_i32\n\t"
185 |
186 | "MOV r0, r12\n\t"
187 | "BL uart_debug_print_i32\n\t"
188 |
189 | "MOV r0, r3\n\t"
190 | "BL uart_debug_print_i32\n\t"
191 |
192 | "MOV r0, r2\n\t"
193 | "BL uart_debug_print_i32\n\t"
194 |
195 | "MOV r0, r0\n\t"
196 | "BL uart_debug_print_i32\n\t"
197 |
198 | "MOV r0, r11\n\t"
199 | "BL uart_debug_print_i32\n\t"
200 |
201 | "MOV r0, r10\n\t"
202 | "BL uart_debug_print_i32\n\t"
203 |
204 | "MOV r0, r9\n\t"
205 | "BL uart_debug_print_i32\n\t"
206 |
207 | "MOV r0, r8\n\t"
208 | "BL uart_debug_print_i32\n\t"
209 |
210 | "MOV r0, r7\n\t"
211 | "BL uart_debug_print_i32\n\t"
212 |
213 | "MOV r0, r6\n\t"
214 | "BL uart_debug_print_i32\n\t"
215 |
216 | "MOV r0, r5\n\t"
217 | "BL uart_debug_print_i32\n\t"
218 |
219 | "MOV r0, r4\n\t"
220 | "BL uart_debug_print_i32\n\t"
221 | );
222 | }
223 | #else
224 | void uart_debug_init(void){}
225 | void uart_debug_print(char* str){}
226 | void uart_debug_print_char(char c){}
227 | char uart_debug_reveive_char(void){}
228 | #endif // ! __CENO_RTOS_UART_DEBUG_ON__
229 |
--------------------------------------------------------------------------------
/board/arch/arm32/ek-TM4C123gxl/TM4C123GH6PM/ceno_os/src/interrupt.c:
--------------------------------------------------------------------------------
1 | #include "../include/interrupt.h"
2 | #include "../include/bsp.h"
3 |
4 |
5 |
6 | void SysTick_Handler(void){
7 | os_tick();
8 | disable_irq();
9 | os_sched();
10 | enable_irq();
11 | if (*l_tickCtr > 0x00){
12 | (*l_tickCtr)--;
13 | }
14 | }
15 |
16 | void PendSV_Handler(void){
17 | uart_debug_print("[kernel] PendSV triggered.\n\r");
18 | os_task_switch_next();
19 | }
20 |
21 | void NMI_Handler(void){
22 |
23 | }
24 |
25 | void MemManage_Handler(void){
26 |
27 | }
28 |
29 | void BusFault_Handler(void){
30 |
31 | }
32 |
33 | void UsageFault_Handler(void){
34 |
35 | }
36 |
37 | void HardFault_Handler(void){
38 |
39 | }
40 |
41 | void SVC_Handler(void){
42 |
43 | }
44 |
45 | void DebugMon_Handler(void){
46 |
47 | }
48 |
49 | void GPIOPortA_IRQHandler(void){
50 |
51 | }
52 |
53 | void GPIOPortB_IRQHandler(void){
54 |
55 | }
56 |
57 | void GPIOPortC_IRQHandler(void){
58 |
59 | }
60 |
61 | void GPIOPortD_IRQHandler(void){
62 |
63 | }
64 |
65 | void GPIOPortE_IRQHandler(void){
66 |
67 | }
68 |
69 | void UART0_IRQHandler(void){
70 |
71 | }
72 |
73 | void UART1_IRQHandler(void){
74 |
75 | }
76 |
77 | void SSI0_IRQHandler(void){
78 |
79 | }
80 |
81 | void I2C0_IRQHandler(void){
82 |
83 | }
84 |
85 | void PWMFault_IRQHandler(void){
86 |
87 | }
88 |
89 | void PWMGen0_IRQHandler(void){
90 |
91 | }
92 |
93 | void PWMGen1_IRQHandler(void){
94 |
95 | }
96 |
97 | void PWMGen2_IRQHandler(void){
98 |
99 | }
100 |
101 | void QEI0_IRQHandler(void){
102 |
103 | }
104 |
105 | void ADCSeq0_IRQHandler(void){
106 |
107 | }
108 |
109 | void ADCSeq1_IRQHandler(void){
110 |
111 | }
112 |
113 | void ADCSeq2_IRQHandler(void){
114 |
115 | }
116 |
117 | void ADCSeq3_IRQHandler(void){
118 |
119 | }
120 |
121 | void Watchdog_IRQHandler(void){
122 |
123 | }
124 |
125 | void Timer0A_IRQHandler(void){
126 |
127 | }
128 |
129 | void Timer0B_IRQHandler(void){
130 |
131 | }
132 |
133 | void Timer1A_IRQHandler(void){
134 |
135 | }
136 |
137 | void Timer1B_IRQHandler(void){
138 |
139 | }
140 |
141 | void Timer2A_IRQHandler(void){
142 |
143 | }
144 |
145 | void Timer2B_IRQHandler(void){
146 |
147 | }
148 |
149 | void Comp0_IRQHandler(void){
150 |
151 | }
152 |
153 | void Comp1_IRQHandler(void){
154 |
155 | }
156 |
157 | void Comp2_IRQHandler(void){
158 |
159 | }
160 |
161 | void SysCtrl_IRQHandler(void){
162 |
163 | }
164 |
165 | void FlashCtrl_IRQHandler(void){
166 |
167 | }
168 |
169 | void GPIOPortF_IRQHandler(void){
170 |
171 | }
172 |
173 | void GPIOPortG_IRQHandler(void){
174 |
175 | }
176 |
177 | void GPIOPortH_IRQHandler(void){
178 |
179 | }
180 |
181 | void UART2_IRQHandler(void){
182 |
183 | }
184 |
185 | void SSI1_IRQHandler(void){
186 |
187 | }
188 |
189 | void Timer3A_IRQHandler(void){
190 |
191 | }
192 |
193 | void Timer3B_IRQHandler(void){
194 |
195 | }
196 |
197 | void I2C1_IRQHandler(void){
198 |
199 | }
200 |
201 | void QEI1_IRQHandler(void){
202 |
203 | }
204 |
205 | void CAN0_IRQHandler(void){
206 |
207 | }
208 |
209 | void CAN1_IRQHandler(void){
210 |
211 | }
212 |
213 | void CAN2_IRQHandler(void){
214 |
215 | }
216 |
217 | void Hibernate_IRQHandler(void){
218 |
219 | }
220 |
221 | void USB0_IRQHandler(void){
222 |
223 | }
224 |
225 | void PWMGen3_IRQHandler(void){
226 |
227 | }
228 | void uDMAST_IRQHandler(void){
229 |
230 | }
231 | void uDMAError_IRQHandler(void){
232 |
233 | }
234 | void ADC1Seq0_IRQHandler(void){
235 |
236 | }
237 | void ADC1Seq1_IRQHandler(void){
238 |
239 | }
240 | void ADC1Seq2_IRQHandler(void){
241 |
242 | }
243 | void ADC1Seq3_IRQHandler(void){
244 |
245 | }
246 | void I2S0_IRQHandler(void){
247 |
248 | }
249 | void EBI0_IRQHandler(void){
250 |
251 | }
252 | void GPIOPortJ_IRQHandler(void){
253 |
254 | }
255 | void GPIOPortK_IRQHandler(void){
256 |
257 | }
258 | void GPIOPortL_IRQHandler(void){
259 |
260 | }
261 | void SSI2_IRQHandler(void){
262 |
263 | }
264 | void SSI3_IRQHandler(void){
265 |
266 | }
267 | void UART3_IRQHandler(void){
268 |
269 | }
270 | void UART4_IRQHandler(void){
271 |
272 | }
273 | void UART5_IRQHandler(void){
274 |
275 | }
276 | void UART6_IRQHandler(void){
277 |
278 | }
279 | void UART7_IRQHandler(void){
280 |
281 | }
282 | void I2C2_IRQHandler(void){
283 |
284 | }
285 | void I2C3_IRQHandler(void){
286 |
287 | }
288 | void Timer4A_IRQHandler(void){
289 |
290 | }
291 | void Timer4B_IRQHandler(void){
292 |
293 | }
294 | void Timer5A_IRQHandler(void){
295 |
296 | }
297 | void Timer5B_IRQHandler(void){
298 |
299 | }
300 | void WideTimer0A_IRQHandler(void){
301 |
302 | }
303 | void WideTimer0B_IRQHandler(void){
304 |
305 | }
306 | void WideTimer1A_IRQHandler(void){
307 |
308 | }
309 | void WideTimer1B_IRQHandler(void){
310 |
311 | }
312 | void WideTimer2A_IRQHandler(void){
313 |
314 | }
315 | void WideTimer2B_IRQHandler(void){
316 |
317 | }
318 | void WideTimer3A_IRQHandler(void){
319 |
320 | }
321 | void WideTimer3B_IRQHandler(void){
322 |
323 | }
324 | void WideTimer4A_IRQHandler(void){
325 |
326 | }
327 | void WideTimer4B_IRQHandler(void){
328 |
329 | }
330 | void WideTimer5A_IRQHandler(void){
331 |
332 | }
333 | void WideTimer5B_IRQHandler(void){
334 |
335 | }
336 | void FPU_IRQHandler(void){
337 |
338 | }
339 | void PECI0_IRQHandler(void){
340 |
341 | }
342 | void LPC0_IRQHandler(void){
343 |
344 | }
345 | void I2C4_IRQHandler(void){
346 |
347 | }
348 | void I2C5_IRQHandler(void){
349 |
350 | }
351 | void GPIOPortM_IRQHandler(void){
352 |
353 | }
354 | void GPIOPortN_IRQHandler(void){
355 |
356 | }
357 | void QEI2_IRQHandler(void){
358 |
359 | }
360 | void Fan0_IRQHandler(void){
361 |
362 | }
363 | void GPIOPortP0_IRQHandler(void){
364 |
365 | }
366 | void GPIOPortP1_IRQHandler(void){
367 |
368 | }
369 | void GPIOPortP2_IRQHandler(void){
370 |
371 | }
372 | void GPIOPortP3_IRQHandler(void){
373 |
374 | }
375 | void GPIOPortP4_IRQHandler(void){
376 |
377 | }
378 | void GPIOPortP5_IRQHandler(void){
379 |
380 | }
381 | void GPIOPortP6_IRQHandler(void){
382 |
383 | }
384 | void GPIOPortP7_IRQHandler(void){
385 |
386 | }
387 | void GPIOPortQ0_IRQHandler(void){
388 |
389 | }
390 | void GPIOPortQ1_IRQHandler(void){
391 |
392 | }
393 | void GPIOPortQ2_IRQHandler(void){
394 |
395 | }
396 | void GPIOPortQ3_IRQHandler(void){
397 |
398 | }
399 | void GPIOPortQ4_IRQHandler(void){
400 |
401 | }
402 | void GPIOPortQ5_IRQHandler(void){
403 |
404 | }
405 | void GPIOPortQ6_IRQHandler(void){
406 |
407 | }
408 | void GPIOPortQ7_IRQHandler(void){
409 |
410 | }
411 | void GPIOPortR_IRQHandler(void){
412 |
413 | }
414 | void GPIOPortS_IRQHandler(void){
415 |
416 | }
417 | void PWM1Gen0_IRQHandler(void){
418 |
419 | }
420 | void PWM1Gen1_IRQHandler(void){
421 |
422 | }
423 | void PWM1Gen2_IRQHandler(void){
424 |
425 | }
426 | void PWM1Gen3_IRQHandler(void){
427 |
428 | }
429 | void PWM1Fault_IRQHandler(void){
430 |
431 | }
432 | void SystemException_ISR(void){
433 |
434 | }
--------------------------------------------------------------------------------
/kernel/network/mqtt/include/packet.h:
--------------------------------------------------------------------------------
1 | #ifndef __CENO_NET_MQTT_PACKET_H__
2 | #define __CENO_NET_MQTT_PACKET_H__
3 |
4 | /**
5 | * MQTT 报文定义
6 | * https://mcxiaoke.gitbooks.io/mqtt-cn/content/mqtt/02-ControlPacketFormat.html
7 | */
8 |
9 |
10 |
11 |
12 | #define MQTT_PACKET_LEN_BIT_NUM (7)
13 | #define MQTT_PACKET_LEN_MASK (1 << MQTT_PACKET_LEN_BIT_NUM)
14 |
15 | #define MQTT_PACKET_MAX_LEN (4)
16 |
17 |
18 | enum errors
19 | {
20 | MQTTPACKET_BUFFER_TOO_SHORT = -2,
21 | MQTTPACKET_READ_ERROR = -1,
22 | MQTTPACKET_READ_COMPLETE
23 | };
24 |
25 | /**
26 | * 控制报文类型
27 | */
28 | typedef enum mqtt_packet_type
29 | {
30 | MQTT_PACKET_TYPE_RESERVED = 0, //Reserved 0 禁止 保留
31 | MQTT_PACKET_TYPE_CONNECT = 1, //CONNECT 1 客户端到服务端 客户端请求连接服务端
32 | MQTT_PACKET_TYPE_CONNACK = 2, //CONNACK 2 服务端到客户端 连接报文确认
33 | MQTT_PACKET_TYPE_PUBLISH = 3, //PUBLISH 3 两个方向都允许 发布消息
34 | MQTT_PACKET_TYPE_PUBACK = 4, //PUBACK 4 两个方向都允许 QoS 1消息发布收到确认
35 | MQTT_PACKET_TYPE_PUBREC = 5, //PUBREC 5 两个方向都允许 发布收到(保证交付第一步)
36 | MQTT_PACKET_TYPE_PUBREL = 6, //PUBREL 6 两个方向都允许 发布释放(保证交付第二步)
37 | MQTT_PACKET_TYPE_PUBCOMP = 7, //PUBCOMP 7 两个方向都允许 QoS 2消息发布完成(保证交互第三步)
38 | MQTT_PACKET_TYPE_SUBSCRIBE = 8, //SUBSCRIBE 8 客户端到服务端 客户端订阅请求
39 | MQTT_PACKET_TYPE_SUBACK = 9, //SUBACK 9 服务端到客户端 订阅请求报文确认
40 | MQTT_PACKET_TYPE_UNSUBSCRIBE = 10, //UNSUBSCRIBE 10 客户端到服务端 客户端取消订阅请求
41 | MQTT_PACKET_TYPE_UNSUBACK = 11, //UNSUBACK 11 服务端到客户端 取消订阅报文确认
42 | MQTT_PACKET_TYPE_PINGREQ = 12, //PINGREQ 12 客户端到服务端 心跳请求
43 | MQTT_PACKET_TYPE_PINGRESP = 13, //PINGRESP 13 服务端到客户端 心跳响应
44 | MQTT_PACKET_TYPE_DISCONNECT = 14, //DISCONNECT 14 客户端到服务端 客户端断开连接
45 | MQTT_PACKET_TYPE_MAX = 15, //Reserved 15 禁止 保留
46 | } mqtt_packet_type_e;
47 |
48 |
49 | #define MQTT_PROTO_NAME_LEN (2)
50 | #define MQTT_PROTO_NAME_SIZE (4)
51 | #define MQTT_PROTO_LEVEL (4)
52 |
53 | #define MQTT_STRING_LEN (2)
54 | #define MQTT_DATA_LEN (2)
55 | #define MQTT_QOS_LEN (1)
56 |
57 | #define MQTT_CONNECT_HEAD_INIT {{0, MQTT_PROTO_NAME_SIZE}, {'M', 'Q', 'T', 'T'}, MQTT_PROTO_LEVEL, {0}, 0}
58 | #define MQTT_CONNECT_OPT_INIT {{{0, MQTT_PROTO_NAME_SIZE}, {'M', 'Q', 'T', 'T'}, MQTT_PROTO_LEVEL, {0}, 0}, {NULL, NULL, NULL, NULL, NULL}}
59 |
60 |
61 | /**
62 | * 固定报头
63 | */
64 | typedef struct mqtt_fix_head
65 | {
66 | union
67 | {
68 | unsigned char byte;
69 | struct
70 | {
71 | unsigned char retain : 1; //PUBLISH报文的保留标志
72 | unsigned char qos : 2; //PUBLISH报文的服务质量等级
73 | unsigned char dup : 1; //控制报文的重复分发标志
74 | unsigned char type : 4;
75 | } bits;
76 | } mqtt_first_byte_u;
77 | /**
78 | * 剩余长度(Remaining Length)表示当前报文剩余部分的字节数,包括可变报头和负载的数据。
79 | * 剩余长度不包括用于编码剩余长度字段本身的字节数。
80 | *
81 | * 1个字节时,从0(0x00)到127(0x7f)
82 | * 2个字节时,从128(0x80,0x01)到16383(0Xff,0x7f)
83 | * 3个字节时,从16384(0x80,0x80,0x01)到2097151(0xFF,0xFF,0x7F)
84 | * 4个字节时,从2097152(0x80,0x80,0x80,0x01)到268435455(0xFF,0xFF,0xFF,0x7F)
85 | * */
86 | unsigned char remaining_len[MQTT_PACKET_MAX_LEN];
87 | } mqtt_fix_head_t;
88 |
89 |
90 | typedef struct mqtt_connect_head
91 | {
92 | unsigned char proto_len[MQTT_PROTO_NAME_LEN];
93 | unsigned char proto_name[MQTT_PROTO_NAME_SIZE];
94 | unsigned char proto_level; // 协议级别
95 | union
96 | {
97 | unsigned char connect_flag;
98 | struct
99 | {
100 | unsigned char reserved : 1;
101 | unsigned char clean_session : 1; // 清理会话
102 | unsigned char will_flag : 1; // 遗嘱标志
103 | unsigned char will_qos : 2; // 遗嘱QOS
104 | unsigned char will_retain : 1; // 遗嘱保留
105 | unsigned char psd_flag : 1; // 密码标志符
106 | unsigned char user_name_flag : 1; // 用户名标志符
107 | } bits; // 连接标志位
108 | } mqtt_connect_flag_u;
109 | unsigned short keep_alive; // 保持连接
110 | } mqtt_connect_head_t;
111 |
112 |
113 | /**
114 | * 有效载荷
115 | */
116 | typedef struct mqtt_connect_payload
117 | {
118 | char *client_id; // 客户端标志符号
119 | char *will_topic; // 遗嘱主题
120 | char *will_msg; // 遗嘱消息
121 | char *user_name; // 用户名
122 | char *password; // 密码
123 | } mqtt_connect_payload_t;
124 |
125 |
126 | typedef struct mqtt_connect_opt
127 | {
128 | mqtt_connect_head_t connect_head;
129 | mqtt_connect_payload_t connect_payload;
130 | } mqtt_connect_opt_t;
131 |
132 |
133 | typedef struct mqtt_publish_head
134 | {
135 | char *topic;
136 | unsigned short topic_len;
137 | unsigned short packet_id;
138 | } mqtt_publish_head_t;
139 |
140 |
141 | typedef struct mqtt_publish_payload
142 | {
143 | char *msg;
144 | size_t msg_len;
145 | } mqtt_publish_payload_t;
146 |
147 |
148 | typedef struct mqtt_publish_opt
149 | {
150 | mqtt_publish_head_t publish_head;
151 | mqtt_publish_payload_t publish_payload;
152 | unsigned char dup;
153 | unsigned char qos;
154 | unsigned char retain;
155 | } mqtt_publish_opt_t;
156 |
157 |
158 | typedef struct mqtt_subscribe_head
159 | {
160 | unsigned short packet_id;
161 | } mqtt_subscribe_head_t;
162 |
163 |
164 | typedef struct mqtt_subscribe_payload
165 | {
166 | unsigned char count;
167 | char **topic;
168 | unsigned char qoss[0];
169 | } mqtt_subscribe_payload_t;
170 |
171 |
172 | typedef struct mqtt_subscribe_opt
173 | {
174 | mqtt_subscribe_head_t subscribe_head;
175 | mqtt_subscribe_payload_t subscribe_payload;
176 | } mqtt_subscribe_opt_t;
177 |
178 |
179 | typedef struct mqtt_unsubscribe_head
180 | {
181 | unsigned short packet_id;
182 | } mqtt_unsubscribe_head_t;
183 |
184 |
185 | typedef struct mqtt_unsubscribe_payload
186 | {
187 | unsigned char count;
188 | char **topic;
189 | } mqtt_unsubscribe_payload_t;
190 |
191 |
192 | typedef struct mqtt_unsubscribe_opt
193 | {
194 | mqtt_unsubscribe_head_t unsubscribe_head;
195 | mqtt_unsubscribe_payload_t unsubscribe_payload;
196 | } mqtt_unsubscribe_opt_t;
197 |
198 |
199 | typedef struct mqtt_suback_head
200 | {
201 | unsigned short packet_id;
202 | } mqtt_suback_head_t;
203 |
204 |
205 | typedef struct mqtt_suback_payload
206 | {
207 | unsigned char ret_code[0];
208 | } mqtt_suback_payload_t;
209 |
210 |
211 | typedef struct mqtt_suback_opt
212 | {
213 | unsigned char count;
214 | mqtt_suback_head_t suback_head;
215 | mqtt_suback_payload_t suback_payload;
216 | } mqtt_suback_opt_t;
217 |
218 |
219 | typedef struct mqtt_puback_head
220 | {
221 | unsigned short packet_id;
222 | } mqtt_puback_head_t;
223 |
224 |
225 | typedef struct mqtt_puback_payload
226 | {
227 | unsigned char null[0];
228 | } mqtt_puback_payload_t;
229 |
230 |
231 | typedef struct mqtt_puback_opt
232 | {
233 | unsigned char type;
234 | mqtt_puback_head_t puback_head;
235 | mqtt_puback_payload_t puback_payload;
236 | } mqtt_puback_opt_t;
237 |
238 |
239 |
240 | int mqtt_encode_fixhead(unsigned char *buf, unsigned char type, unsigned char dup,
241 | unsigned char qos, unsigned char retain, int remaining_len);
242 | int mqtt_encode_connect(unsigned char *buf, int buf_len, mqtt_connect_opt_t *options);
243 | int mqtt_encode_publish(unsigned char *buf, int buf_len, mqtt_publish_opt_t *options);
244 | int mqtt_encode_subscribe(unsigned char *buf, int buf_len, mqtt_subscribe_opt_t *options);
245 | int mqtt_encode_ping(unsigned char *buf, int buf_len);
246 | int mqtt_decode_fixhead(unsigned char *buf, unsigned char *type, unsigned char *dup,
247 | unsigned char *qos, unsigned char *retain, int *remaining_len);
248 | int mqtt_decode_publish(unsigned char *buf, int buf_len, mqtt_publish_opt_t *options);
249 | int mqtt_decode_suback(unsigned char *buf, int buf_len, mqtt_suback_opt_t *options);
250 | int mqtt_encode_puback(unsigned char *buf, int buf_len, mqtt_puback_opt_t *options);
251 | int mqtt_encode_unsubscribe(unsigned char *buf, int buf_len, mqtt_unsubscribe_opt_t *options);
252 |
253 |
254 | #endif // ! __CENO_NET_MQTT_PACKET_H__
--------------------------------------------------------------------------------
/user/asm/os_queue.s:
--------------------------------------------------------------------------------
1 | .cpu arm7tdmi
2 | .eabi_attribute 20, 1
3 | .eabi_attribute 21, 1
4 | .eabi_attribute 23, 3
5 | .eabi_attribute 24, 1
6 | .eabi_attribute 25, 1
7 | .eabi_attribute 26, 1
8 | .eabi_attribute 30, 6
9 | .eabi_attribute 34, 0
10 | .eabi_attribute 18, 4
11 | .file "os_queue.c"
12 | .text
13 | .section .rodata
14 | .align 2
15 | .LC0:
16 | .ascii "[queue] queue create : \000"
17 | .align 2
18 | .LC1:
19 | .ascii "\012\015\000"
20 | .align 2
21 | .LC2:
22 | .ascii "[queue] queue create : heap malloc failed!\012\015\000"
23 | .text
24 | .align 2
25 | .global os_queue_create
26 | .syntax unified
27 | .arm
28 | .fpu softvfp
29 | .type os_queue_create, %function
30 | os_queue_create:
31 | @ Function supports interworking.
32 | @ args = 0, pretend = 0, frame = 32
33 | @ frame_needed = 1, uses_anonymous_args = 0
34 | push {fp, lr}
35 | add fp, sp, #4
36 | sub sp, sp, #32
37 | str r0, [fp, #-24]
38 | str r1, [fp, #-28]
39 | str r2, [fp, #-32]
40 | ldr r0, .L6
41 | bl uart_debug_print
42 | ldr r0, [fp, #-28]
43 | bl uart_debug_print
44 | ldr r0, .L6+4
45 | bl uart_debug_print
46 | ldr r3, [fp, #-32]
47 | cmp r3, #0
48 | bne .L2
49 | mov r3, #1
50 | b .L5
51 | .L2:
52 | ldr r3, [fp, #-32]
53 | lsl r3, r3, #2
54 | mov r0, r3
55 | bl os_heap_malloc
56 | mov r2, r0
57 | ldr r3, [fp, #-24]
58 | str r2, [r3, #28]
59 | ldr r3, [fp, #-24]
60 | ldr r3, [r3, #28]
61 | cmp r3, #0
62 | bne .L4
63 | ldr r0, .L6+8
64 | bl uart_debug_print
65 | mov r3, #1
66 | b .L5
67 | .L4:
68 | ldr r3, [fp, #-28]
69 | str r3, [fp, #-12]
70 | mov r3, #4
71 | strb r3, [fp, #-8]
72 | ldr r3, [fp, #-24]
73 | mov ip, r3
74 | sub r3, fp, #20
75 | ldm r3, {r0, r1, r2, r3}
76 | stm ip, {r0, r1, r2, r3}
77 | ldr r3, [fp, #-24]
78 | mov r2, #0
79 | str r2, [r3, #20]
80 | ldr r3, [fp, #-24]
81 | mov r2, #0
82 | str r2, [r3, #24]
83 | ldr r3, [fp, #-24]
84 | ldr r2, [fp, #-32]
85 | str r2, [r3, #16]
86 | mov r3, #0
87 | .L5:
88 | mov r0, r3
89 | sub sp, fp, #4
90 | @ sp needed
91 | pop {fp, lr}
92 | bx lr
93 | .L7:
94 | .align 2
95 | .L6:
96 | .word .LC0
97 | .word .LC1
98 | .word .LC2
99 | .size os_queue_create, .-os_queue_create
100 | .section .rodata
101 | .align 2
102 | .LC3:
103 | .ascii "[queue] queue en : queue is full!\012\015\000"
104 | .global __aeabi_uidivmod
105 | .text
106 | .align 2
107 | .global os_queue_item_en
108 | .syntax unified
109 | .arm
110 | .fpu softvfp
111 | .type os_queue_item_en, %function
112 | os_queue_item_en:
113 | @ Function supports interworking.
114 | @ args = 0, pretend = 0, frame = 8
115 | @ frame_needed = 1, uses_anonymous_args = 0
116 | push {fp, lr}
117 | add fp, sp, #4
118 | sub sp, sp, #8
119 | str r0, [fp, #-8]
120 | str r1, [fp, #-12]
121 | ldr r0, [fp, #-8]
122 | bl os_queue_is_full
123 | mov r3, r0
124 | cmp r3, #1
125 | bne .L9
126 | ldr r0, .L11
127 | bl uart_debug_print
128 | mov r3, #1
129 | b .L10
130 | .L9:
131 | ldr r3, [fp, #-8]
132 | ldr r2, [r3, #28]
133 | ldr r3, [fp, #-8]
134 | ldr r3, [r3, #24]
135 | lsl r3, r3, #2
136 | add r3, r2, r3
137 | ldr r2, [fp, #-12]
138 | str r2, [r3]
139 | ldr r3, [fp, #-8]
140 | ldr r3, [r3, #24]
141 | add r2, r3, #1
142 | ldr r3, [fp, #-8]
143 | ldr r3, [r3, #16]
144 | mov r1, r3
145 | mov r0, r2
146 | bl __aeabi_uidivmod
147 | mov r3, r1
148 | mov r2, r3
149 | ldr r3, [fp, #-8]
150 | str r2, [r3, #24]
151 | mov r3, #0
152 | .L10:
153 | mov r0, r3
154 | sub sp, fp, #4
155 | @ sp needed
156 | pop {fp, lr}
157 | bx lr
158 | .L12:
159 | .align 2
160 | .L11:
161 | .word .LC3
162 | .size os_queue_item_en, .-os_queue_item_en
163 | .section .rodata
164 | .align 2
165 | .LC4:
166 | .ascii "[queue] queue de : queue is empty!\012\015\000"
167 | .text
168 | .align 2
169 | .global os_queue_item_de
170 | .syntax unified
171 | .arm
172 | .fpu softvfp
173 | .type os_queue_item_de, %function
174 | os_queue_item_de:
175 | @ Function supports interworking.
176 | @ args = 0, pretend = 0, frame = 8
177 | @ frame_needed = 1, uses_anonymous_args = 0
178 | push {fp, lr}
179 | add fp, sp, #4
180 | sub sp, sp, #8
181 | str r0, [fp, #-8]
182 | str r1, [fp, #-12]
183 | ldr r0, [fp, #-8]
184 | bl os_queue_is_empty
185 | mov r3, r0
186 | cmp r3, #1
187 | bne .L14
188 | ldr r0, .L16
189 | bl uart_debug_print
190 | mov r3, #1
191 | b .L15
192 | .L14:
193 | ldr r3, [fp, #-8]
194 | ldr r2, [r3, #28]
195 | ldr r3, [fp, #-8]
196 | ldr r3, [r3, #20]
197 | lsl r3, r3, #2
198 | add r3, r2, r3
199 | ldr r2, [r3]
200 | ldr r3, [fp, #-12]
201 | str r2, [r3]
202 | ldr r3, [fp, #-8]
203 | ldr r3, [r3, #20]
204 | add r2, r3, #1
205 | ldr r3, [fp, #-8]
206 | ldr r3, [r3, #16]
207 | mov r1, r3
208 | mov r0, r2
209 | bl __aeabi_uidivmod
210 | mov r3, r1
211 | mov r2, r3
212 | ldr r3, [fp, #-8]
213 | str r2, [r3, #20]
214 | mov r3, #0
215 | .L15:
216 | mov r0, r3
217 | sub sp, fp, #4
218 | @ sp needed
219 | pop {fp, lr}
220 | bx lr
221 | .L17:
222 | .align 2
223 | .L16:
224 | .word .LC4
225 | .size os_queue_item_de, .-os_queue_item_de
226 | .section .rodata
227 | .align 2
228 | .LC5:
229 | .ascii "[queue] queue traverse \012\015\000"
230 | .align 2
231 | .LC6:
232 | .ascii " |--[queue item] at : '\000"
233 | .align 2
234 | .LC7:
235 | .ascii "'\012\015\000"
236 | .text
237 | .align 2
238 | .global os_queue_traverse
239 | .syntax unified
240 | .arm
241 | .fpu softvfp
242 | .type os_queue_traverse, %function
243 | os_queue_traverse:
244 | @ Function supports interworking.
245 | @ args = 0, pretend = 0, frame = 16
246 | @ frame_needed = 1, uses_anonymous_args = 0
247 | push {fp, lr}
248 | add fp, sp, #4
249 | sub sp, sp, #16
250 | str r0, [fp, #-16]
251 | ldr r3, [fp, #-16]
252 | ldr r3, [r3, #20]
253 | str r3, [fp, #-8]
254 | ldr r0, .L21
255 | bl uart_debug_print
256 | b .L19
257 | .L20:
258 | ldr r0, .L21+4
259 | bl uart_debug_print
260 | ldr r3, [fp, #-16]
261 | ldr r2, [r3, #28]
262 | ldr r3, [fp, #-8]
263 | lsl r3, r3, #2
264 | add r3, r2, r3
265 | ldr r3, [r3]
266 | mov r1, #16
267 | mov r0, r3
268 | bl uart_debug_print_i32
269 | ldr r0, .L21+8
270 | bl uart_debug_print
271 | ldr r3, [fp, #-8]
272 | add r2, r3, #1
273 | ldr r3, [fp, #-16]
274 | ldr r3, [r3, #16]
275 | mov r1, r3
276 | mov r0, r2
277 | bl __aeabi_uidivmod
278 | mov r3, r1
279 | str r3, [fp, #-8]
280 | .L19:
281 | ldr r3, [fp, #-16]
282 | ldr r3, [r3, #24]
283 | ldr r2, [fp, #-8]
284 | cmp r2, r3
285 | bne .L20
286 | nop
287 | mov r0, r3
288 | sub sp, fp, #4
289 | @ sp needed
290 | pop {fp, lr}
291 | bx lr
292 | .L22:
293 | .align 2
294 | .L21:
295 | .word .LC5
296 | .word .LC6
297 | .word .LC7
298 | .size os_queue_traverse, .-os_queue_traverse
299 | .align 2
300 | .global os_queue_length
301 | .syntax unified
302 | .arm
303 | .fpu softvfp
304 | .type os_queue_length, %function
305 | os_queue_length:
306 | @ Function supports interworking.
307 | @ args = 0, pretend = 0, frame = 8
308 | @ frame_needed = 1, uses_anonymous_args = 0
309 | push {fp, lr}
310 | add fp, sp, #4
311 | sub sp, sp, #8
312 | str r0, [fp, #-8]
313 | ldr r3, [fp, #-8]
314 | ldr r2, [r3, #24]
315 | ldr r3, [fp, #-8]
316 | ldr r3, [r3, #20]
317 | sub r2, r2, r3
318 | ldr r3, [fp, #-8]
319 | ldr r3, [r3, #16]
320 | add r2, r2, r3
321 | ldr r3, [fp, #-8]
322 | ldr r3, [r3, #16]
323 | mov r1, r3
324 | mov r0, r2
325 | bl __aeabi_uidivmod
326 | mov r3, r1
327 | mov r0, r3
328 | sub sp, fp, #4
329 | @ sp needed
330 | pop {fp, lr}
331 | bx lr
332 | .size os_queue_length, .-os_queue_length
333 | .align 2
334 | .global os_queue_is_empty
335 | .syntax unified
336 | .arm
337 | .fpu softvfp
338 | .type os_queue_is_empty, %function
339 | os_queue_is_empty:
340 | @ Function supports interworking.
341 | @ args = 0, pretend = 0, frame = 8
342 | @ frame_needed = 1, uses_anonymous_args = 0
343 | @ link register save eliminated.
344 | str fp, [sp, #-4]!
345 | add fp, sp, #0
346 | sub sp, sp, #12
347 | str r0, [fp, #-8]
348 | ldr r3, [fp, #-8]
349 | ldr r2, [r3, #20]
350 | ldr r3, [fp, #-8]
351 | ldr r3, [r3, #24]
352 | cmp r2, r3
353 | bne .L26
354 | mov r3, #1
355 | b .L27
356 | .L26:
357 | mov r3, #0
358 | .L27:
359 | mov r0, r3
360 | add sp, fp, #0
361 | @ sp needed
362 | ldr fp, [sp], #4
363 | bx lr
364 | .size os_queue_is_empty, .-os_queue_is_empty
365 | .align 2
366 | .global os_queue_is_full
367 | .syntax unified
368 | .arm
369 | .fpu softvfp
370 | .type os_queue_is_full, %function
371 | os_queue_is_full:
372 | @ Function supports interworking.
373 | @ args = 0, pretend = 0, frame = 8
374 | @ frame_needed = 1, uses_anonymous_args = 0
375 | push {fp, lr}
376 | add fp, sp, #4
377 | sub sp, sp, #8
378 | str r0, [fp, #-8]
379 | ldr r3, [fp, #-8]
380 | ldr r3, [r3, #24]
381 | add r2, r3, #1
382 | ldr r3, [fp, #-8]
383 | ldr r3, [r3, #16]
384 | mov r1, r3
385 | mov r0, r2
386 | bl __aeabi_uidivmod
387 | mov r3, r1
388 | mov r2, r3
389 | ldr r3, [fp, #-8]
390 | ldr r3, [r3, #20]
391 | cmp r2, r3
392 | bne .L29
393 | mov r3, #1
394 | b .L30
395 | .L29:
396 | mov r3, #0
397 | .L30:
398 | mov r0, r3
399 | sub sp, fp, #4
400 | @ sp needed
401 | pop {fp, lr}
402 | bx lr
403 | .size os_queue_is_full, .-os_queue_is_full
404 | .ident "GCC: (GNU Tools for Arm Embedded Processors 7-2018-q2-update) 7.3.1 20180622 (release) [ARM/embedded-7-branch revision 261907]"
405 |
--------------------------------------------------------------------------------
/user/asm/os_task.s:
--------------------------------------------------------------------------------
1 | .cpu arm7tdmi
2 | .eabi_attribute 20, 1
3 | .eabi_attribute 21, 1
4 | .eabi_attribute 23, 3
5 | .eabi_attribute 24, 1
6 | .eabi_attribute 25, 1
7 | .eabi_attribute 26, 1
8 | .eabi_attribute 30, 6
9 | .eabi_attribute 34, 0
10 | .eabi_attribute 18, 4
11 | .file "os_task.c"
12 | .text
13 | .comm osTaskCurr,4,4
14 | .comm osTaskNext,4,4
15 | .section .rodata
16 | .align 2
17 | .LC0:
18 | .ascii "[task] create task : '\000"
19 | .align 2
20 | .LC1:
21 | .ascii "'\012\015\000"
22 | .align 2
23 | .LC2:
24 | .ascii "[task] task add to queue failed!\012\015\000"
25 | .align 2
26 | .LC3:
27 | .ascii "[task] task '\000"
28 | .align 2
29 | .LC4:
30 | .ascii "' add to queue '\000"
31 | .align 2
32 | .LC5:
33 | .ascii "'.\012\015\000"
34 | .text
35 | .align 2
36 | .global os_task_create
37 | .syntax unified
38 | .arm
39 | .fpu softvfp
40 | .type os_task_create, %function
41 | os_task_create:
42 | @ Function supports interworking.
43 | @ args = 8, pretend = 0, frame = 32
44 | @ frame_needed = 1, uses_anonymous_args = 0
45 | push {fp, lr}
46 | add fp, sp, #4
47 | sub sp, sp, #32
48 | str r0, [fp, #-24]
49 | str r1, [fp, #-28]
50 | str r2, [fp, #-32]
51 | str r3, [fp, #-36]
52 | ldr r0, .L6
53 | bl uart_debug_print
54 | ldr r0, [fp, #-28]
55 | bl uart_debug_print
56 | ldr r0, .L6+4
57 | bl uart_debug_print
58 | ldr r2, [fp, #-36]
59 | ldr r3, [fp, #4]
60 | add r3, r2, r3
61 | bic r3, r3, #7
62 | str r3, [fp, #-8]
63 | ldr r3, [fp, #-8]
64 | sub r3, r3, #4
65 | str r3, [fp, #-8]
66 | ldr r3, [fp, #-8]
67 | mov r2, #16777216
68 | str r2, [r3]
69 | ldr r3, [fp, #-8]
70 | sub r3, r3, #4
71 | str r3, [fp, #-8]
72 | ldr r2, [fp, #8]
73 | ldr r3, [fp, #-8]
74 | str r2, [r3]
75 | ldr r3, [fp, #-8]
76 | sub r3, r3, #4
77 | str r3, [fp, #-8]
78 | ldr r3, [fp, #-8]
79 | mov r2, #14
80 | str r2, [r3]
81 | ldr r3, [fp, #-8]
82 | sub r3, r3, #4
83 | str r3, [fp, #-8]
84 | ldr r3, [fp, #-8]
85 | mov r2, #12
86 | str r2, [r3]
87 | ldr r3, [fp, #-8]
88 | sub r3, r3, #4
89 | str r3, [fp, #-8]
90 | ldr r3, [fp, #-8]
91 | mov r2, #3
92 | str r2, [r3]
93 | ldr r3, [fp, #-8]
94 | sub r3, r3, #4
95 | str r3, [fp, #-8]
96 | ldr r3, [fp, #-8]
97 | mov r2, #2
98 | str r2, [r3]
99 | ldr r3, [fp, #-8]
100 | sub r3, r3, #4
101 | str r3, [fp, #-8]
102 | ldr r3, [fp, #-8]
103 | mov r2, #1
104 | str r2, [r3]
105 | ldr r3, [fp, #-8]
106 | sub r3, r3, #4
107 | str r3, [fp, #-8]
108 | ldr r3, [fp, #-8]
109 | mov r2, #0
110 | str r2, [r3]
111 | ldr r3, [fp, #-8]
112 | sub r3, r3, #4
113 | str r3, [fp, #-8]
114 | ldr r3, [fp, #-8]
115 | mov r2, #11
116 | str r2, [r3]
117 | ldr r3, [fp, #-8]
118 | sub r3, r3, #4
119 | str r3, [fp, #-8]
120 | ldr r3, [fp, #-8]
121 | mov r2, #10
122 | str r2, [r3]
123 | ldr r3, [fp, #-8]
124 | sub r3, r3, #4
125 | str r3, [fp, #-8]
126 | ldr r3, [fp, #-8]
127 | mov r2, #9
128 | str r2, [r3]
129 | ldr r3, [fp, #-8]
130 | sub r3, r3, #4
131 | str r3, [fp, #-8]
132 | ldr r3, [fp, #-8]
133 | mov r2, #8
134 | str r2, [r3]
135 | ldr r3, [fp, #-8]
136 | sub r3, r3, #4
137 | str r3, [fp, #-8]
138 | ldr r3, [fp, #-8]
139 | mov r2, #7
140 | str r2, [r3]
141 | ldr r3, [fp, #-8]
142 | sub r3, r3, #4
143 | str r3, [fp, #-8]
144 | ldr r3, [fp, #-8]
145 | mov r2, #6
146 | str r2, [r3]
147 | ldr r3, [fp, #-8]
148 | sub r3, r3, #4
149 | str r3, [fp, #-8]
150 | ldr r3, [fp, #-8]
151 | mov r2, #5
152 | str r2, [r3]
153 | ldr r3, [fp, #-8]
154 | sub r3, r3, #4
155 | str r3, [fp, #-8]
156 | ldr r3, [fp, #-8]
157 | mov r2, #4
158 | str r2, [r3]
159 | ldr r3, [fp, #-24]
160 | ldr r2, [fp, #-8]
161 | str r2, [r3]
162 | ldr r3, [fp, #-36]
163 | sub r3, r3, #1
164 | bic r3, r3, #7
165 | add r3, r3, #8
166 | str r3, [fp, #-12]
167 | ldr r3, [fp, #-8]
168 | sub r3, r3, #4
169 | str r3, [fp, #-8]
170 | b .L2
171 | .L3:
172 | ldr r3, [fp, #-8]
173 | ldr r2, .L6+8
174 | str r2, [r3]
175 | ldr r3, [fp, #-8]
176 | sub r3, r3, #4
177 | str r3, [fp, #-8]
178 | .L2:
179 | ldr r2, [fp, #-8]
180 | ldr r3, [fp, #-12]
181 | cmp r2, r3
182 | bcs .L3
183 | ldr r3, [fp, #-24]
184 | mov r2, #1
185 | str r2, [r3, #12]
186 | ldr r3, [fp, #-24]
187 | ldr r2, [fp, #-28]
188 | str r2, [r3, #24]
189 | ldr r3, [fp, #-24]
190 | mov r2, #0
191 | str r2, [r3, #36]
192 | ldr r3, [fp, #-24]
193 | ldr r2, [fp, #-32]
194 | str r2, [r3, #40]
195 | ldr r3, [fp, #-32]
196 | cmp r3, #0
197 | beq .L4
198 | ldr r3, [fp, #-24]
199 | mov r2, #2
200 | strb r2, [r3, #32]
201 | .L4:
202 | ldr r1, [fp, #-24]
203 | ldr r0, .L6+12
204 | bl os_queue_item_en
205 | mov r3, r0
206 | strb r3, [fp, #-13]
207 | ldrb r3, [fp, #-13] @ zero_extendqisi2
208 | cmp r3, #1
209 | bne .L5
210 | ldr r0, .L6+16
211 | bl uart_debug_print
212 | .L5:
213 | ldr r0, .L6+20
214 | bl uart_debug_print
215 | ldr r3, [fp, #-24]
216 | ldr r3, [r3, #24]
217 | mov r0, r3
218 | bl uart_debug_print
219 | ldr r0, .L6+24
220 | bl uart_debug_print
221 | ldr r3, .L6+12
222 | ldr r3, [r3, #8]
223 | mov r0, r3
224 | bl uart_debug_print
225 | ldr r0, .L6+28
226 | bl uart_debug_print
227 | nop
228 | mov r0, r3
229 | sub sp, fp, #4
230 | @ sp needed
231 | pop {fp, lr}
232 | bx lr
233 | .L7:
234 | .align 2
235 | .L6:
236 | .word .LC0
237 | .word .LC1
238 | .word -559038737
239 | .word osTaskQueue
240 | .word .LC2
241 | .word .LC3
242 | .word .LC4
243 | .word .LC5
244 | .size os_task_create, .-os_task_create
245 | .section .rodata
246 | .align 2
247 | .LC6:
248 | .ascii "[task] task switch next : '\000"
249 | .align 2
250 | .LC7:
251 | .ascii "[task] task current is null.\012\015\000"
252 | .align 2
253 | .LC8:
254 | .ascii "[task] task next is null.\012\015\000"
255 | .align 2
256 | .LC9:
257 | .ascii "[task] contex switch finished. never be here!!!\012"
258 | .ascii "\015\000"
259 | .text
260 | .align 2
261 | .global os_task_switch_next
262 | .syntax unified
263 | .arm
264 | .fpu softvfp
265 | .type os_task_switch_next, %function
266 | os_task_switch_next:
267 | @ Function supports interworking.
268 | @ args = 0, pretend = 0, frame = 0
269 | @ frame_needed = 1, uses_anonymous_args = 0
270 | push {fp, lr}
271 | add fp, sp, #4
272 | ldr r0, .L11
273 | bl uart_debug_print
274 | ldr r3, .L11+4
275 | ldr r3, [r3]
276 | ldr r3, [r3, #24]
277 | mov r0, r3
278 | bl uart_debug_print
279 | ldr r0, .L11+8
280 | bl uart_debug_print
281 | ldr r3, .L11+12
282 | ldr r3, [r3]
283 | cmp r3, #0
284 | bne .L9
285 | ldr r0, .L11+16
286 | bl uart_debug_print
287 | .L9:
288 | ldr r3, .L11+4
289 | ldr r3, [r3]
290 | cmp r3, #0
291 | bne .L10
292 | ldr r0, .L11+20
293 | bl uart_debug_print
294 | .L10:
295 | .syntax divided
296 | @ 124 "/Users/neroyang/project/Ceno-RTOS/kernel/ceno/src/os_task.c" 1
297 | CPSID I
298 | LDR r3,.L11+12
299 | LDR r3,[r3,#0x00]
300 | CBZ r3,.PendSV_restore
301 | PUSH {r4,r11}
302 | LDR r3,.L11+12
303 | LDR r3,[r3]
304 | STR sp,[r3]
305 | .PendSV_restore:
306 | LDR r3,.L11+4
307 | LDR r3, [r3]
308 | LDR sp, [r3]
309 | LDR r3,.L11+4
310 | LDR r3,[r3]
311 | LDR r2,.L11+12
312 | STR r3,[r2]
313 | POP {r4,r11}
314 | CPSIE I
315 | MOV r0,lr
316 | BX lr
317 | @ 0 "" 2
318 | .arm
319 | .syntax unified
320 | ldr r0, .L11+24
321 | bl uart_debug_print
322 | nop
323 | mov r0, r3
324 | sub sp, fp, #4
325 | @ sp needed
326 | pop {fp, lr}
327 | bx lr
328 | .L12:
329 | .align 2
330 | .L11:
331 | .word .LC6
332 | .word osTaskNext
333 | .word .LC5
334 | .word osTaskCurr
335 | .word .LC7
336 | .word .LC8
337 | .word .LC9
338 | .size os_task_switch_next, .-os_task_switch_next
339 | .align 2
340 | .global os_task_exit
341 | .syntax unified
342 | .arm
343 | .fpu softvfp
344 | .type os_task_exit, %function
345 | os_task_exit:
346 | @ Function supports interworking.
347 | @ args = 0, pretend = 0, frame = 0
348 | @ frame_needed = 1, uses_anonymous_args = 0
349 | @ link register save eliminated.
350 | str fp, [sp, #-4]!
351 | add fp, sp, #0
352 | nop
353 | mov r0, r3
354 | add sp, fp, #0
355 | @ sp needed
356 | ldr fp, [sp], #4
357 | bx lr
358 | .size os_task_exit, .-os_task_exit
359 | .align 2
360 | .global os_task_switch_context
361 | .syntax unified
362 | .arm
363 | .fpu softvfp
364 | .type os_task_switch_context, %function
365 | os_task_switch_context:
366 | @ Function supports interworking.
367 | @ args = 0, pretend = 0, frame = 8
368 | @ frame_needed = 1, uses_anonymous_args = 0
369 | @ link register save eliminated.
370 | str fp, [sp, #-4]!
371 | add fp, sp, #0
372 | sub sp, sp, #12
373 | str r0, [fp, #-8]
374 | ldr r2, .L15
375 | ldr r3, [fp, #-8]
376 | str r3, [r2]
377 | nop
378 | mov r0, r3
379 | add sp, fp, #0
380 | @ sp needed
381 | ldr fp, [sp], #4
382 | bx lr
383 | .L16:
384 | .align 2
385 | .L15:
386 | .word osTaskCurr
387 | .size os_task_switch_context, .-os_task_switch_context
388 | .align 2
389 | .global delay
390 | .syntax unified
391 | .arm
392 | .fpu softvfp
393 | .type delay, %function
394 | delay:
395 | @ Function supports interworking.
396 | @ args = 0, pretend = 0, frame = 8
397 | @ frame_needed = 1, uses_anonymous_args = 0
398 | @ link register save eliminated.
399 | str fp, [sp, #-4]!
400 | add fp, sp, #0
401 | sub sp, sp, #12
402 | str r0, [fp, #-8]
403 | ldr r3, .L18
404 | ldr r3, [r3]
405 | mov r2, #3
406 | strb r2, [r3, #32]
407 | ldr r3, .L18
408 | ldr r3, [r3]
409 | ldr r2, [fp, #-8]
410 | str r2, [r3, #36]
411 | nop
412 | add sp, fp, #0
413 | @ sp needed
414 | ldr fp, [sp], #4
415 | bx lr
416 | .L19:
417 | .align 2
418 | .L18:
419 | .word osTaskCurr
420 | .size delay, .-delay
421 | .ident "GCC: (GNU Tools for Arm Embedded Processors 7-2018-q2-update) 7.3.1 20180622 (release) [ARM/embedded-7-branch revision 261907]"
422 |
--------------------------------------------------------------------------------
/user/asm/system_TM4C123GH6PM.s:
--------------------------------------------------------------------------------
1 | .cpu arm7tdmi
2 | .eabi_attribute 20, 1
3 | .eabi_attribute 21, 1
4 | .eabi_attribute 23, 3
5 | .eabi_attribute 24, 1
6 | .eabi_attribute 25, 1
7 | .eabi_attribute 26, 1
8 | .eabi_attribute 30, 6
9 | .eabi_attribute 34, 0
10 | .eabi_attribute 18, 4
11 | .file "system_TM4C123GH6PM.c"
12 | .text
13 | .global SystemCoreClock
14 | .data
15 | .align 2
16 | .type SystemCoreClock, %object
17 | .size SystemCoreClock, 4
18 | SystemCoreClock:
19 | .word 50000000
20 | .text
21 | .align 2
22 | .syntax unified
23 | .arm
24 | .fpu softvfp
25 | .type getOscClk, %function
26 | getOscClk:
27 | @ Function supports interworking.
28 | @ args = 0, pretend = 0, frame = 16
29 | @ frame_needed = 1, uses_anonymous_args = 0
30 | @ link register save eliminated.
31 | str fp, [sp, #-4]!
32 | add fp, sp, #0
33 | sub sp, sp, #20
34 | str r0, [fp, #-16]
35 | str r1, [fp, #-20]
36 | ldr r3, .L35
37 | str r3, [fp, #-8]
38 | ldr r3, [fp, #-20]
39 | cmp r3, #3
40 | ldrls pc, [pc, r3, asl #2]
41 | b .L2
42 | .L4:
43 | .word .L3
44 | .word .L5
45 | .word .L6
46 | .word .L7
47 | .L3:
48 | ldr r3, [fp, #-16]
49 | cmp r3, #22
50 | ldrls pc, [pc, r3, asl #2]
51 | b .L34
52 | .L10:
53 | .word .L9
54 | .word .L11
55 | .word .L12
56 | .word .L13
57 | .word .L14
58 | .word .L15
59 | .word .L16
60 | .word .L17
61 | .word .L18
62 | .word .L19
63 | .word .L20
64 | .word .L21
65 | .word .L22
66 | .word .L23
67 | .word .L24
68 | .word .L25
69 | .word .L26
70 | .word .L27
71 | .word .L28
72 | .word .L29
73 | .word .L30
74 | .word .L31
75 | .word .L32
76 | .L9:
77 | ldr r3, .L35+4
78 | str r3, [fp, #-8]
79 | b .L8
80 | .L11:
81 | ldr r3, .L35+8
82 | str r3, [fp, #-8]
83 | b .L8
84 | .L12:
85 | ldr r3, .L35+12
86 | str r3, [fp, #-8]
87 | b .L8
88 | .L13:
89 | mov r3, #2457600
90 | str r3, [fp, #-8]
91 | b .L8
92 | .L14:
93 | ldr r3, .L35+16
94 | str r3, [fp, #-8]
95 | b .L8
96 | .L15:
97 | mov r3, #3686400
98 | str r3, [fp, #-8]
99 | b .L8
100 | .L16:
101 | ldr r3, .L35+20
102 | str r3, [fp, #-8]
103 | b .L8
104 | .L17:
105 | mov r3, #4096000
106 | str r3, [fp, #-8]
107 | b .L8
108 | .L18:
109 | mov r3, #4915200
110 | str r3, [fp, #-8]
111 | b .L8
112 | .L19:
113 | ldr r3, .L35+24
114 | str r3, [fp, #-8]
115 | b .L8
116 | .L20:
117 | ldr r3, .L35+28
118 | str r3, [fp, #-8]
119 | b .L8
120 | .L21:
121 | ldr r3, .L35+32
122 | str r3, [fp, #-8]
123 | b .L8
124 | .L22:
125 | ldr r3, .L35+36
126 | str r3, [fp, #-8]
127 | b .L8
128 | .L23:
129 | ldr r3, .L35+40
130 | str r3, [fp, #-8]
131 | b .L8
132 | .L24:
133 | ldr r3, .L35+44
134 | str r3, [fp, #-8]
135 | b .L8
136 | .L25:
137 | mov r3, #8192000
138 | str r3, [fp, #-8]
139 | b .L8
140 | .L26:
141 | ldr r3, .L35+48
142 | str r3, [fp, #-8]
143 | b .L8
144 | .L27:
145 | ldr r3, .L35
146 | str r3, [fp, #-8]
147 | b .L8
148 | .L28:
149 | ldr r3, .L35+52
150 | str r3, [fp, #-8]
151 | b .L8
152 | .L29:
153 | ldr r3, .L35+56
154 | str r3, [fp, #-8]
155 | b .L8
156 | .L30:
157 | ldr r3, .L35+60
158 | str r3, [fp, #-8]
159 | b .L8
160 | .L31:
161 | ldr r3, .L35+64
162 | str r3, [fp, #-8]
163 | b .L8
164 | .L32:
165 | mov r3, #16384000
166 | str r3, [fp, #-8]
167 | nop
168 | .L8:
169 | b .L34
170 | .L5:
171 | ldr r3, .L35
172 | str r3, [fp, #-8]
173 | b .L2
174 | .L6:
175 | ldr r3, .L35+68
176 | str r3, [fp, #-8]
177 | b .L2
178 | .L7:
179 | ldr r3, .L35+72
180 | str r3, [fp, #-8]
181 | b .L2
182 | .L34:
183 | nop
184 | .L2:
185 | ldr r3, [fp, #-8]
186 | mov r0, r3
187 | add sp, fp, #0
188 | @ sp needed
189 | ldr fp, [sp], #4
190 | bx lr
191 | .L36:
192 | .align 2
193 | .L35:
194 | .word 12000000
195 | .word 1000000
196 | .word 1843200
197 | .word 2000000
198 | .word 3579545
199 | .word 4000000
200 | .word 5000000
201 | .word 5120000
202 | .word 6000000
203 | .word 6144000
204 | .word 7372800
205 | .word 8000000
206 | .word 10000000
207 | .word 12288000
208 | .word 13560000
209 | .word 14318180
210 | .word 16000000
211 | .word 3000000
212 | .word 30000
213 | .size getOscClk, .-getOscClk
214 | .global __aeabi_uidiv
215 | .align 2
216 | .global SystemCoreClockUpdate
217 | .syntax unified
218 | .arm
219 | .fpu softvfp
220 | .type SystemCoreClockUpdate, %function
221 | SystemCoreClockUpdate:
222 | @ Function supports interworking.
223 | @ args = 0, pretend = 0, frame = 8
224 | @ frame_needed = 1, uses_anonymous_args = 0
225 | push {fp, lr}
226 | add fp, sp, #4
227 | sub sp, sp, #8
228 | ldr r3, .L48
229 | ldr r3, [r3, #96]
230 | str r3, [fp, #-8]
231 | ldr r3, .L48
232 | ldr r3, [r3, #112]
233 | str r3, [fp, #-12]
234 | ldr r3, [fp, #-12]
235 | cmp r3, #0
236 | bge .L38
237 | ldr r3, [fp, #-12]
238 | and r3, r3, #2048
239 | cmp r3, #0
240 | beq .L39
241 | ldr r3, [fp, #-8]
242 | lsr r3, r3, #6
243 | and r2, r3, #15
244 | ldr r3, [fp, #-12]
245 | lsr r3, r3, #4
246 | and r3, r3, #7
247 | mov r1, r3
248 | mov r0, r2
249 | bl getOscClk
250 | mov r2, r0
251 | ldr r3, .L48+4
252 | str r2, [r3]
253 | b .L40
254 | .L39:
255 | ldr r3, .L48+4
256 | ldr r2, .L48+8
257 | str r2, [r3]
258 | .L40:
259 | ldr r3, [fp, #-8]
260 | and r3, r3, #4194304
261 | cmp r3, #0
262 | beq .L47
263 | ldr r3, [fp, #-12]
264 | and r3, r3, #2048
265 | cmp r3, #0
266 | beq .L42
267 | ldr r3, .L48+4
268 | ldr r2, [r3]
269 | ldr r3, [fp, #-12]
270 | lsr r3, r3, #23
271 | and r3, r3, #63
272 | add r3, r3, #1
273 | mov r1, r3
274 | mov r0, r2
275 | bl __aeabi_uidiv
276 | mov r3, r0
277 | mov r2, r3
278 | ldr r3, .L48+4
279 | str r2, [r3]
280 | b .L47
281 | .L42:
282 | ldr r3, .L48+4
283 | ldr r2, [r3]
284 | ldr r3, [fp, #-12]
285 | lsr r3, r3, #23
286 | and r3, r3, #63
287 | add r3, r3, #1
288 | mov r1, r3
289 | mov r0, r2
290 | bl __aeabi_uidiv
291 | mov r3, r0
292 | lsr r3, r3, #1
293 | ldr r2, .L48+4
294 | str r3, [r2]
295 | b .L47
296 | .L38:
297 | ldr r3, [fp, #-8]
298 | and r3, r3, #2048
299 | cmp r3, #0
300 | beq .L44
301 | ldr r3, [fp, #-8]
302 | lsr r3, r3, #6
303 | and r2, r3, #31
304 | ldr r3, [fp, #-8]
305 | lsr r3, r3, #4
306 | and r3, r3, #3
307 | mov r1, r3
308 | mov r0, r2
309 | bl getOscClk
310 | mov r2, r0
311 | ldr r3, .L48+4
312 | str r2, [r3]
313 | b .L45
314 | .L44:
315 | ldr r3, .L48+4
316 | ldr r2, .L48+8
317 | str r2, [r3]
318 | .L45:
319 | ldr r3, [fp, #-8]
320 | and r3, r3, #4194304
321 | cmp r3, #0
322 | beq .L47
323 | ldr r3, [fp, #-8]
324 | and r3, r3, #2048
325 | cmp r3, #0
326 | beq .L46
327 | ldr r3, .L48+4
328 | ldr r2, [r3]
329 | ldr r3, [fp, #-8]
330 | lsr r3, r3, #23
331 | and r3, r3, #15
332 | add r3, r3, #1
333 | mov r1, r3
334 | mov r0, r2
335 | bl __aeabi_uidiv
336 | mov r3, r0
337 | mov r2, r3
338 | ldr r3, .L48+4
339 | str r2, [r3]
340 | b .L47
341 | .L46:
342 | ldr r3, .L48+4
343 | ldr r2, [r3]
344 | ldr r3, [fp, #-8]
345 | lsr r3, r3, #23
346 | and r3, r3, #15
347 | add r3, r3, #1
348 | mov r1, r3
349 | mov r0, r2
350 | bl __aeabi_uidiv
351 | mov r3, r0
352 | lsr r3, r3, #1
353 | ldr r2, .L48+4
354 | str r3, [r2]
355 | .L47:
356 | nop
357 | sub sp, fp, #4
358 | @ sp needed
359 | pop {fp, lr}
360 | bx lr
361 | .L49:
362 | .align 2
363 | .L48:
364 | .word 1074782208
365 | .word SystemCoreClock
366 | .word 400000000
367 | .size SystemCoreClockUpdate, .-SystemCoreClockUpdate
368 | .align 2
369 | .global SystemInit
370 | .syntax unified
371 | .arm
372 | .fpu softvfp
373 | .type SystemInit, %function
374 | SystemInit:
375 | @ Function supports interworking.
376 | @ args = 0, pretend = 0, frame = 8
377 | @ frame_needed = 1, uses_anonymous_args = 0
378 | @ link register save eliminated.
379 | str fp, [sp, #-4]!
380 | add fp, sp, #0
381 | sub sp, sp, #12
382 | ldr r3, .L58
383 | ldr r3, [r3, #136]
384 | ldr r2, .L58
385 | orr r3, r3, #15728640
386 | str r3, [r2, #136]
387 | ldr r3, .L58+4
388 | ldr r2, .L58+8
389 | str r2, [r3, #112]
390 | ldr r3, .L58+4
391 | ldr r2, .L58+12
392 | str r2, [r3, #96]
393 | ldr r3, .L58+4
394 | ldr r2, .L58+16
395 | str r2, [r3, #96]
396 | ldr r3, .L58+4
397 | ldr r2, .L58+20
398 | str r2, [r3, #112]
399 | mov r3, #0
400 | str r3, [fp, #-8]
401 | b .L51
402 | .L52:
403 | ldr r3, [fp, #-8]
404 | add r3, r3, #1
405 | str r3, [fp, #-8]
406 | .L51:
407 | ldr r3, [fp, #-8]
408 | cmp r3, #1000
409 | bcc .L52
410 | ldr r3, .L58+4
411 | ldr r2, .L58+24
412 | str r2, [r3, #96]
413 | ldr r3, .L58+4
414 | ldr r2, .L58+28
415 | str r2, [r3, #112]
416 | mov r3, #0
417 | str r3, [fp, #-8]
418 | b .L53
419 | .L54:
420 | ldr r3, [fp, #-8]
421 | add r3, r3, #1
422 | str r3, [fp, #-8]
423 | .L53:
424 | ldr r3, [fp, #-8]
425 | cmp r3, #1000
426 | bcc .L54
427 | ldr r3, .L58+4
428 | ldr r2, .L58+32
429 | str r2, [r3, #96]
430 | nop
431 | .L55:
432 | ldr r3, .L58+4
433 | ldr r3, [r3, #80]
434 | and r3, r3, #64
435 | cmp r3, #64
436 | bne .L55
437 | ldr r3, .L58+4
438 | ldr r2, .L58+36
439 | str r2, [r3, #96]
440 | ldr r3, .L58+4
441 | mov r2, #25165824
442 | str r2, [r3, #112]
443 | mov r3, #0
444 | str r3, [fp, #-8]
445 | b .L56
446 | .L57:
447 | ldr r3, [fp, #-8]
448 | add r3, r3, #1
449 | str r3, [fp, #-8]
450 | .L56:
451 | ldr r3, [fp, #-8]
452 | ldr r2, .L58+40
453 | cmp r3, r2
454 | bls .L57
455 | nop
456 | add sp, fp, #0
457 | @ sp needed
458 | ldr fp, [sp], #4
459 | bx lr
460 | .L59:
461 | .align 2
462 | .L58:
463 | .word -536810240
464 | .word 1074782208
465 | .word 125839376
466 | .word 126761681
467 | .word 27143490
468 | .word 25176064
469 | .word 27135298
470 | .word 25167872
471 | .word 31329602
472 | .word 31327554
473 | .word 9999
474 | .size SystemInit, .-SystemInit
475 | .ident "GCC: (GNU Tools for Arm Embedded Processors 7-2018-q2-update) 7.3.1 20180622 (release) [ARM/embedded-7-branch revision 261907]"
476 |
--------------------------------------------------------------------------------
/user/asm/bsp.s:
--------------------------------------------------------------------------------
1 | .cpu arm7tdmi
2 | .eabi_attribute 20, 1
3 | .eabi_attribute 21, 1
4 | .eabi_attribute 23, 3
5 | .eabi_attribute 24, 1
6 | .eabi_attribute 25, 1
7 | .eabi_attribute 26, 1
8 | .eabi_attribute 30, 6
9 | .eabi_attribute 34, 0
10 | .eabi_attribute 18, 4
11 | .file "bsp.c"
12 | .text
13 | .align 2
14 | .syntax unified
15 | .arm
16 | .fpu softvfp
17 | .type __NVIC_SetPriority, %function
18 | __NVIC_SetPriority:
19 | @ Function supports interworking.
20 | @ args = 0, pretend = 0, frame = 8
21 | @ frame_needed = 1, uses_anonymous_args = 0
22 | @ link register save eliminated.
23 | str fp, [sp, #-4]!
24 | add fp, sp, #0
25 | sub sp, sp, #12
26 | mov r3, r0
27 | str r1, [fp, #-12]
28 | strh r3, [fp, #-6] @ movhi
29 | ldrsh r3, [fp, #-6]
30 | cmp r3, #0
31 | blt .L2
32 | ldr r3, [fp, #-12]
33 | and r2, r3, #255
34 | ldr r1, .L5
35 | ldrsh r3, [fp, #-6]
36 | lsl r2, r2, #5
37 | and r2, r2, #255
38 | add r3, r1, r3
39 | strb r2, [r3, #768]
40 | b .L4
41 | .L2:
42 | ldr r3, [fp, #-12]
43 | and r2, r3, #255
44 | ldr r1, .L5+4
45 | ldrh r3, [fp, #-6]
46 | and r3, r3, #15
47 | sub r3, r3, #4
48 | lsl r2, r2, #5
49 | and r2, r2, #255
50 | add r3, r1, r3
51 | strb r2, [r3, #24]
52 | .L4:
53 | nop
54 | add sp, fp, #0
55 | @ sp needed
56 | ldr fp, [sp], #4
57 | bx lr
58 | .L6:
59 | .align 2
60 | .L5:
61 | .word -536813312
62 | .word -536810240
63 | .size __NVIC_SetPriority, .-__NVIC_SetPriority
64 | .align 2
65 | .syntax unified
66 | .arm
67 | .fpu softvfp
68 | .type SysTick_Config, %function
69 | SysTick_Config:
70 | @ Function supports interworking.
71 | @ args = 0, pretend = 0, frame = 8
72 | @ frame_needed = 1, uses_anonymous_args = 0
73 | push {fp, lr}
74 | add fp, sp, #4
75 | sub sp, sp, #8
76 | str r0, [fp, #-8]
77 | ldr r3, [fp, #-8]
78 | sub r3, r3, #1
79 | cmp r3, #16777216
80 | bcc .L8
81 | mov r3, #1
82 | b .L9
83 | .L8:
84 | ldr r2, .L10
85 | ldr r3, [fp, #-8]
86 | sub r3, r3, #1
87 | str r3, [r2, #4]
88 | mov r1, #7
89 | mvn r0, #0
90 | bl __NVIC_SetPriority
91 | ldr r3, .L10
92 | mov r2, #0
93 | str r2, [r3, #8]
94 | ldr r3, .L10
95 | mov r2, #7
96 | str r2, [r3]
97 | mov r3, #0
98 | .L9:
99 | mov r0, r3
100 | sub sp, fp, #4
101 | @ sp needed
102 | pop {fp, lr}
103 | bx lr
104 | .L11:
105 | .align 2
106 | .L10:
107 | .word -536813552
108 | .size SysTick_Config, .-SysTick_Config
109 | .bss
110 | .align 2
111 | tickCtr:
112 | .space 4
113 | .size tickCtr, 4
114 | .global l_tickCtr
115 | .data
116 | .align 2
117 | .type l_tickCtr, %object
118 | .size l_tickCtr, 4
119 | l_tickCtr:
120 | .word tickCtr
121 | .text
122 | .align 2
123 | .global os_on_startup
124 | .syntax unified
125 | .arm
126 | .fpu softvfp
127 | .type os_on_startup, %function
128 | os_on_startup:
129 | @ Function supports interworking.
130 | @ args = 0, pretend = 0, frame = 0
131 | @ frame_needed = 1, uses_anonymous_args = 0
132 | push {fp, lr}
133 | add fp, sp, #4
134 | bl SystemCoreClockUpdate
135 | ldr r3, .L13
136 | ldr r3, [r3]
137 | mov r0, r3
138 | bl SysTick_Config
139 | mov r1, #0
140 | mvn r0, #0
141 | bl __NVIC_SetPriority
142 | bl enable_irq
143 | nop
144 | sub sp, fp, #4
145 | @ sp needed
146 | pop {fp, lr}
147 | bx lr
148 | .L14:
149 | .align 2
150 | .L13:
151 | .word SystemCoreClock
152 | .size os_on_startup, .-os_on_startup
153 | .align 2
154 | .global disable_irq
155 | .syntax unified
156 | .arm
157 | .fpu softvfp
158 | .type disable_irq, %function
159 | disable_irq:
160 | @ Function supports interworking.
161 | @ args = 0, pretend = 0, frame = 0
162 | @ frame_needed = 1, uses_anonymous_args = 0
163 | @ link register save eliminated.
164 | str fp, [sp, #-4]!
165 | add fp, sp, #0
166 | .syntax divided
167 | @ 18 "/Users/neroyang/project/Ceno-RTOS/board/arch/arm32/ek-TM4C123gxl/TM4C123GH6PM/ceno_os/src/bsp.c" 1
168 | CPSID I
169 |
170 | @ 0 "" 2
171 | .arm
172 | .syntax unified
173 | nop
174 | add sp, fp, #0
175 | @ sp needed
176 | ldr fp, [sp], #4
177 | bx lr
178 | .size disable_irq, .-disable_irq
179 | .align 2
180 | .global enable_irq
181 | .syntax unified
182 | .arm
183 | .fpu softvfp
184 | .type enable_irq, %function
185 | enable_irq:
186 | @ Function supports interworking.
187 | @ args = 0, pretend = 0, frame = 0
188 | @ frame_needed = 1, uses_anonymous_args = 0
189 | @ link register save eliminated.
190 | str fp, [sp, #-4]!
191 | add fp, sp, #0
192 | .syntax divided
193 | @ 24 "/Users/neroyang/project/Ceno-RTOS/board/arch/arm32/ek-TM4C123gxl/TM4C123GH6PM/ceno_os/src/bsp.c" 1
194 | CPSIE I
195 |
196 | @ 0 "" 2
197 | .arm
198 | .syntax unified
199 | nop
200 | add sp, fp, #0
201 | @ sp needed
202 | ldr fp, [sp], #4
203 | bx lr
204 | .size enable_irq, .-enable_irq
205 | .global counter
206 | .bss
207 | .align 2
208 | .type counter, %object
209 | .size counter, 4
210 | counter:
211 | .space 4
212 | .text
213 | .align 2
214 | .global delay_block
215 | .syntax unified
216 | .arm
217 | .fpu softvfp
218 | .type delay_block, %function
219 | delay_block:
220 | @ Function supports interworking.
221 | @ args = 0, pretend = 0, frame = 8
222 | @ frame_needed = 1, uses_anonymous_args = 0
223 | @ link register save eliminated.
224 | str fp, [sp, #-4]!
225 | add fp, sp, #0
226 | sub sp, sp, #12
227 | str r0, [fp, #-8]
228 | ldr r3, .L19
229 | ldr r3, [r3]
230 | ldr r2, [fp, #-8]
231 | str r2, [r3]
232 | nop
233 | .L18:
234 | ldr r3, .L19
235 | ldr r3, [r3]
236 | ldr r3, [r3]
237 | cmp r3, #0
238 | bgt .L18
239 | nop
240 | add sp, fp, #0
241 | @ sp needed
242 | ldr fp, [sp], #4
243 | bx lr
244 | .L20:
245 | .align 2
246 | .L19:
247 | .word l_tickCtr
248 | .size delay_block, .-delay_block
249 | .align 2
250 | .global bsp_init
251 | .syntax unified
252 | .arm
253 | .fpu softvfp
254 | .type bsp_init, %function
255 | bsp_init:
256 | @ Function supports interworking.
257 | @ args = 0, pretend = 0, frame = 0
258 | @ frame_needed = 1, uses_anonymous_args = 0
259 | push {fp, lr}
260 | add fp, sp, #4
261 | ldr r3, .L22
262 | ldr r3, [r3, #1544]
263 | ldr r2, .L22
264 | orr r3, r3, #32
265 | str r3, [r2, #1544]
266 | ldr r3, .L22+4
267 | mov r2, #14
268 | str r2, [r3, #1024]
269 | ldr r3, .L22+4
270 | mov r2, #14
271 | str r2, [r3, #1308]
272 | ldr r3, .L22+4
273 | ldr r3, [r3, #1020]
274 | ldr r2, .L22+4
275 | bic r3, r3, #14
276 | str r3, [r2, #1020]
277 | bl uart_debug_init
278 | bl disable_irq
279 | nop
280 | sub sp, fp, #4
281 | @ sp needed
282 | pop {fp, lr}
283 | bx lr
284 | .L23:
285 | .align 2
286 | .L22:
287 | .word 1074782208
288 | .word 1073893376
289 | .size bsp_init, .-bsp_init
290 | .align 2
291 | .global light_red_on
292 | .syntax unified
293 | .arm
294 | .fpu softvfp
295 | .type light_red_on, %function
296 | light_red_on:
297 | @ Function supports interworking.
298 | @ args = 0, pretend = 0, frame = 0
299 | @ frame_needed = 1, uses_anonymous_args = 0
300 | @ link register save eliminated.
301 | str fp, [sp, #-4]!
302 | add fp, sp, #0
303 | ldr r3, .L25
304 | mov r2, #2
305 | str r2, [r3, #1020]
306 | nop
307 | add sp, fp, #0
308 | @ sp needed
309 | ldr fp, [sp], #4
310 | bx lr
311 | .L26:
312 | .align 2
313 | .L25:
314 | .word 1073893376
315 | .size light_red_on, .-light_red_on
316 | .align 2
317 | .global light_green_on
318 | .syntax unified
319 | .arm
320 | .fpu softvfp
321 | .type light_green_on, %function
322 | light_green_on:
323 | @ Function supports interworking.
324 | @ args = 0, pretend = 0, frame = 0
325 | @ frame_needed = 1, uses_anonymous_args = 0
326 | @ link register save eliminated.
327 | str fp, [sp, #-4]!
328 | add fp, sp, #0
329 | ldr r3, .L28
330 | mov r2, #8
331 | str r2, [r3, #1020]
332 | nop
333 | add sp, fp, #0
334 | @ sp needed
335 | ldr fp, [sp], #4
336 | bx lr
337 | .L29:
338 | .align 2
339 | .L28:
340 | .word 1073893376
341 | .size light_green_on, .-light_green_on
342 | .align 2
343 | .global light_blue_on
344 | .syntax unified
345 | .arm
346 | .fpu softvfp
347 | .type light_blue_on, %function
348 | light_blue_on:
349 | @ Function supports interworking.
350 | @ args = 0, pretend = 0, frame = 0
351 | @ frame_needed = 1, uses_anonymous_args = 0
352 | @ link register save eliminated.
353 | str fp, [sp, #-4]!
354 | add fp, sp, #0
355 | ldr r3, .L31
356 | mov r2, #4
357 | str r2, [r3, #1020]
358 | nop
359 | add sp, fp, #0
360 | @ sp needed
361 | ldr fp, [sp], #4
362 | bx lr
363 | .L32:
364 | .align 2
365 | .L31:
366 | .word 1073893376
367 | .size light_blue_on, .-light_blue_on
368 | .align 2
369 | .global light_red_off
370 | .syntax unified
371 | .arm
372 | .fpu softvfp
373 | .type light_red_off, %function
374 | light_red_off:
375 | @ Function supports interworking.
376 | @ args = 0, pretend = 0, frame = 0
377 | @ frame_needed = 1, uses_anonymous_args = 0
378 | @ link register save eliminated.
379 | str fp, [sp, #-4]!
380 | add fp, sp, #0
381 | ldr r3, .L34
382 | ldr r3, [r3, #1020]
383 | ldr r2, .L34
384 | bic r3, r3, #2
385 | str r3, [r2, #1020]
386 | nop
387 | add sp, fp, #0
388 | @ sp needed
389 | ldr fp, [sp], #4
390 | bx lr
391 | .L35:
392 | .align 2
393 | .L34:
394 | .word 1073893376
395 | .size light_red_off, .-light_red_off
396 | .align 2
397 | .global light_green_off
398 | .syntax unified
399 | .arm
400 | .fpu softvfp
401 | .type light_green_off, %function
402 | light_green_off:
403 | @ Function supports interworking.
404 | @ args = 0, pretend = 0, frame = 0
405 | @ frame_needed = 1, uses_anonymous_args = 0
406 | @ link register save eliminated.
407 | str fp, [sp, #-4]!
408 | add fp, sp, #0
409 | ldr r3, .L37
410 | ldr r3, [r3, #1020]
411 | ldr r2, .L37
412 | bic r3, r3, #8
413 | str r3, [r2, #1020]
414 | nop
415 | add sp, fp, #0
416 | @ sp needed
417 | ldr fp, [sp], #4
418 | bx lr
419 | .L38:
420 | .align 2
421 | .L37:
422 | .word 1073893376
423 | .size light_green_off, .-light_green_off
424 | .align 2
425 | .global light_blue_off
426 | .syntax unified
427 | .arm
428 | .fpu softvfp
429 | .type light_blue_off, %function
430 | light_blue_off:
431 | @ Function supports interworking.
432 | @ args = 0, pretend = 0, frame = 0
433 | @ frame_needed = 1, uses_anonymous_args = 0
434 | @ link register save eliminated.
435 | str fp, [sp, #-4]!
436 | add fp, sp, #0
437 | ldr r3, .L40
438 | ldr r3, [r3, #1020]
439 | ldr r2, .L40
440 | bic r3, r3, #4
441 | str r3, [r2, #1020]
442 | nop
443 | add sp, fp, #0
444 | @ sp needed
445 | ldr fp, [sp], #4
446 | bx lr
447 | .L41:
448 | .align 2
449 | .L40:
450 | .word 1073893376
451 | .size light_blue_off, .-light_blue_off
452 | .ident "GCC: (GNU Tools for Arm Embedded Processors 7-2018-q2-update) 7.3.1 20180622 (release) [ARM/embedded-7-branch revision 261907]"
453 |
--------------------------------------------------------------------------------
/user/asm/uart_debug.s:
--------------------------------------------------------------------------------
1 | .cpu arm7tdmi
2 | .eabi_attribute 20, 1
3 | .eabi_attribute 21, 1
4 | .eabi_attribute 23, 3
5 | .eabi_attribute 24, 1
6 | .eabi_attribute 25, 1
7 | .eabi_attribute 26, 1
8 | .eabi_attribute 30, 6
9 | .eabi_attribute 34, 0
10 | .eabi_attribute 18, 4
11 | .file "uart_debug.c"
12 | .text
13 | .align 2
14 | .global uart_debug_init
15 | .syntax unified
16 | .arm
17 | .fpu softvfp
18 | .type uart_debug_init, %function
19 | uart_debug_init:
20 | @ Function supports interworking.
21 | @ args = 0, pretend = 0, frame = 0
22 | @ frame_needed = 1, uses_anonymous_args = 0
23 | @ link register save eliminated.
24 | str fp, [sp, #-4]!
25 | add fp, sp, #0
26 | ldr r3, .L2
27 | ldr r3, [r3, #1560]
28 | ldr r2, .L2
29 | orr r3, r3, #1
30 | str r3, [r2, #1560]
31 | ldr r3, .L2
32 | ldr r3, [r3, #1544]
33 | ldr r2, .L2
34 | orr r3, r3, #1
35 | str r3, [r2, #1544]
36 | ldr r3, .L2+4
37 | mov r2, #3
38 | str r2, [r3, #1056]
39 | ldr r3, .L2+4
40 | mov r2, #17
41 | str r2, [r3, #1324]
42 | ldr r3, .L2+4
43 | mov r2, #3
44 | str r2, [r3, #1308]
45 | ldr r3, .L2+8
46 | ldr r3, [r3, #48]
47 | ldr r2, .L2+8
48 | bic r3, r3, #1
49 | str r3, [r2, #48]
50 | ldr r3, .L2+8
51 | mov r2, #104
52 | str r2, [r3, #36]
53 | ldr r3, .L2+8
54 | mov r2, #11
55 | str r2, [r3, #40]
56 | ldr r3, .L2+8
57 | mov r2, #96
58 | str r2, [r3, #44]
59 | ldr r3, .L2+8
60 | mov r2, #0
61 | str r2, [r3, #4040]
62 | ldr r3, .L2+8
63 | ldr r2, .L2+12
64 | str r2, [r3, #48]
65 | nop
66 | add sp, fp, #0
67 | @ sp needed
68 | ldr fp, [sp], #4
69 | bx lr
70 | .L3:
71 | .align 2
72 | .L2:
73 | .word 1074782208
74 | .word 1073758208
75 | .word 1073790976
76 | .word 769
77 | .size uart_debug_init, .-uart_debug_init
78 | .align 2
79 | .global uart_debug_print
80 | .syntax unified
81 | .arm
82 | .fpu softvfp
83 | .type uart_debug_print, %function
84 | uart_debug_print:
85 | @ Function supports interworking.
86 | @ args = 0, pretend = 0, frame = 8
87 | @ frame_needed = 1, uses_anonymous_args = 0
88 | push {fp, lr}
89 | add fp, sp, #4
90 | sub sp, sp, #8
91 | str r0, [fp, #-8]
92 | b .L5
93 | .L6:
94 | ldr r3, [fp, #-8]
95 | add r2, r3, #1
96 | str r2, [fp, #-8]
97 | ldrb r3, [r3] @ zero_extendqisi2
98 | mov r0, r3
99 | bl uart_debug_print_char
100 | .L5:
101 | ldr r3, [fp, #-8]
102 | ldrb r3, [r3] @ zero_extendqisi2
103 | cmp r3, #0
104 | bne .L6
105 | nop
106 | sub sp, fp, #4
107 | @ sp needed
108 | pop {fp, lr}
109 | bx lr
110 | .size uart_debug_print, .-uart_debug_print
111 | .align 2
112 | .global uart_debug_print_char
113 | .syntax unified
114 | .arm
115 | .fpu softvfp
116 | .type uart_debug_print_char, %function
117 | uart_debug_print_char:
118 | @ Function supports interworking.
119 | @ args = 0, pretend = 0, frame = 8
120 | @ frame_needed = 1, uses_anonymous_args = 0
121 | @ link register save eliminated.
122 | str fp, [sp, #-4]!
123 | add fp, sp, #0
124 | sub sp, sp, #12
125 | mov r3, r0
126 | strb r3, [fp, #-5]
127 | nop
128 | .L8:
129 | ldr r3, .L9
130 | ldr r3, [r3, #24]
131 | and r3, r3, #32
132 | cmp r3, #0
133 | bne .L8
134 | ldr r2, .L9
135 | ldrb r3, [fp, #-5] @ zero_extendqisi2
136 | str r3, [r2]
137 | nop
138 | add sp, fp, #0
139 | @ sp needed
140 | ldr fp, [sp], #4
141 | bx lr
142 | .L10:
143 | .align 2
144 | .L9:
145 | .word 1073790976
146 | .size uart_debug_print_char, .-uart_debug_print_char
147 | .align 2
148 | .global uart_debug_reveive_char
149 | .syntax unified
150 | .arm
151 | .fpu softvfp
152 | .type uart_debug_reveive_char, %function
153 | uart_debug_reveive_char:
154 | @ Function supports interworking.
155 | @ args = 0, pretend = 0, frame = 8
156 | @ frame_needed = 1, uses_anonymous_args = 0
157 | @ link register save eliminated.
158 | str fp, [sp, #-4]!
159 | add fp, sp, #0
160 | sub sp, sp, #12
161 | nop
162 | .L12:
163 | ldr r3, .L14
164 | ldr r3, [r3, #24]
165 | and r3, r3, #16
166 | cmp r3, #0
167 | bne .L12
168 | ldr r3, .L14
169 | ldr r3, [r3]
170 | strb r3, [fp, #-5]
171 | ldrb r3, [fp, #-5] @ zero_extendqisi2
172 | mov r0, r3
173 | add sp, fp, #0
174 | @ sp needed
175 | ldr fp, [sp], #4
176 | bx lr
177 | .L15:
178 | .align 2
179 | .L14:
180 | .word 1073790976
181 | .size uart_debug_reveive_char, .-uart_debug_reveive_char
182 | .align 2
183 | .global uart_debug_print_number
184 | .syntax unified
185 | .arm
186 | .fpu softvfp
187 | .type uart_debug_print_number, %function
188 | uart_debug_print_number:
189 | @ Function supports interworking.
190 | @ args = 0, pretend = 0, frame = 8
191 | @ frame_needed = 1, uses_anonymous_args = 0
192 | push {fp, lr}
193 | add fp, sp, #4
194 | sub sp, sp, #8
195 | str r0, [fp, #-8]
196 | str r1, [fp, #-12]
197 | ldr r3, [fp, #-8]
198 | cmp r3, #0
199 | bne .L17
200 | ldr r3, [fp, #-12]
201 | cmp r3, #1
202 | bne .L17
203 | mov r0, #48
204 | bl uart_debug_print_char
205 | .L17:
206 | ldr r3, [fp, #-8]
207 | cmp r3, #1
208 | bne .L18
209 | mov r0, #49
210 | bl uart_debug_print_char
211 | .L18:
212 | ldr r3, [fp, #-8]
213 | cmp r3, #2
214 | bne .L19
215 | mov r0, #50
216 | bl uart_debug_print_char
217 | .L19:
218 | ldr r3, [fp, #-8]
219 | cmp r3, #3
220 | bne .L20
221 | mov r0, #51
222 | bl uart_debug_print_char
223 | .L20:
224 | ldr r3, [fp, #-8]
225 | cmp r3, #4
226 | bne .L21
227 | mov r0, #52
228 | bl uart_debug_print_char
229 | .L21:
230 | ldr r3, [fp, #-8]
231 | cmp r3, #5
232 | bne .L22
233 | mov r0, #53
234 | bl uart_debug_print_char
235 | .L22:
236 | ldr r3, [fp, #-8]
237 | cmp r3, #6
238 | bne .L23
239 | mov r0, #54
240 | bl uart_debug_print_char
241 | .L23:
242 | ldr r3, [fp, #-8]
243 | cmp r3, #7
244 | bne .L24
245 | mov r0, #55
246 | bl uart_debug_print_char
247 | .L24:
248 | ldr r3, [fp, #-8]
249 | cmp r3, #8
250 | bne .L25
251 | mov r0, #56
252 | bl uart_debug_print_char
253 | .L25:
254 | ldr r3, [fp, #-8]
255 | cmp r3, #9
256 | bne .L26
257 | mov r0, #57
258 | bl uart_debug_print_char
259 | .L26:
260 | ldr r3, [fp, #-8]
261 | cmp r3, #10
262 | bne .L27
263 | mov r0, #97
264 | bl uart_debug_print_char
265 | .L27:
266 | ldr r3, [fp, #-8]
267 | cmp r3, #11
268 | bne .L28
269 | mov r0, #98
270 | bl uart_debug_print_char
271 | .L28:
272 | ldr r3, [fp, #-8]
273 | cmp r3, #12
274 | bne .L29
275 | mov r0, #99
276 | bl uart_debug_print_char
277 | .L29:
278 | ldr r3, [fp, #-8]
279 | cmp r3, #13
280 | bne .L30
281 | mov r0, #100
282 | bl uart_debug_print_char
283 | .L30:
284 | ldr r3, [fp, #-8]
285 | cmp r3, #15
286 | bne .L31
287 | mov r0, #101
288 | bl uart_debug_print_char
289 | .L31:
290 | ldr r3, [fp, #-8]
291 | cmp r3, #15
292 | bne .L33
293 | mov r0, #102
294 | bl uart_debug_print_char
295 | .L33:
296 | nop
297 | sub sp, fp, #4
298 | @ sp needed
299 | pop {fp, lr}
300 | bx lr
301 | .size uart_debug_print_number, .-uart_debug_print_number
302 | .global __aeabi_uidiv
303 | .align 2
304 | .global uart_debug_print_i32
305 | .syntax unified
306 | .arm
307 | .fpu softvfp
308 | .type uart_debug_print_i32, %function
309 | uart_debug_print_i32:
310 | @ Function supports interworking.
311 | @ args = 0, pretend = 0, frame = 32
312 | @ frame_needed = 1, uses_anonymous_args = 0
313 | push {r4, fp, lr}
314 | add fp, sp, #8
315 | sub sp, sp, #36
316 | str r0, [fp, #-40]
317 | str r1, [fp, #-44]
318 | ldr r3, [fp, #-44]
319 | cmp r3, #16
320 | bne .L35
321 | mov r0, #48
322 | bl uart_debug_print_char
323 | mov r0, #120
324 | bl uart_debug_print_char
325 | mov r3, #0
326 | str r3, [fp, #-16]
327 | b .L36
328 | .L37:
329 | ldr r3, [fp, #-16]
330 | rsb r3, r3, #7
331 | lsl r3, r3, #2
332 | ldr r2, [fp, #-40]
333 | lsr r3, r2, r3
334 | and r3, r3, #15
335 | str r3, [fp, #-28]
336 | mov r1, #1
337 | ldr r0, [fp, #-28]
338 | bl uart_debug_print_number
339 | ldr r3, [fp, #-16]
340 | add r3, r3, #1
341 | str r3, [fp, #-16]
342 | .L36:
343 | ldr r3, [fp, #-16]
344 | cmp r3, #7
345 | ble .L37
346 | b .L45
347 | .L35:
348 | ldr r3, [fp, #-44]
349 | cmp r3, #10
350 | bne .L45
351 | ldr r3, .L46
352 | str r3, [fp, #-32]
353 | mov r3, #0
354 | str r3, [fp, #-20]
355 | b .L39
356 | .L44:
357 | ldr r3, [fp, #-32]
358 | mov r1, r3
359 | ldr r0, [fp, #-40]
360 | bl __aeabi_uidiv
361 | mov r3, r0
362 | str r3, [fp, #-24]
363 | ldr r3, [fp, #-24]
364 | cmp r3, #0
365 | beq .L40
366 | mov r3, #1
367 | str r3, [fp, #-20]
368 | .L40:
369 | ldr r3, [fp, #-20]
370 | cmp r3, #0
371 | bne .L41
372 | mov r1, #0
373 | ldr r0, [fp, #-24]
374 | bl uart_debug_print_number
375 | b .L42
376 | .L41:
377 | mov r1, #1
378 | ldr r0, [fp, #-24]
379 | bl uart_debug_print_number
380 | .L42:
381 | ldr r3, [fp, #-32]
382 | ldr r2, [fp, #-40]
383 | cmp r2, r3
384 | bcc .L43
385 | ldr r1, [fp, #-32]
386 | ldr r2, [fp, #-24]
387 | mul r3, r2, r1
388 | ldr r2, [fp, #-40]
389 | sub r3, r2, r3
390 | str r3, [fp, #-40]
391 | .L43:
392 | ldr r2, [fp, #-32]
393 | ldr r1, .L46+4
394 | umull r3, r4, r2, r1
395 | lsr r3, r4, #3
396 | str r3, [fp, #-32]
397 | .L39:
398 | ldr r3, [fp, #-32]
399 | cmp r3, #1
400 | bne .L44
401 | mov r1, #1
402 | ldr r0, [fp, #-40]
403 | bl uart_debug_print_number
404 | .L45:
405 | nop
406 | sub sp, fp, #8
407 | @ sp needed
408 | pop {r4, fp, lr}
409 | bx lr
410 | .L47:
411 | .align 2
412 | .L46:
413 | .word 1000000000
414 | .word -858993459
415 | .size uart_debug_print_i32, .-uart_debug_print_i32
416 | .align 2
417 | .global uart_debug_print_os_register
418 | .syntax unified
419 | .arm
420 | .fpu softvfp
421 | .type uart_debug_print_os_register, %function
422 | uart_debug_print_os_register:
423 | @ Function supports interworking.
424 | @ args = 0, pretend = 0, frame = 0
425 | @ frame_needed = 1, uses_anonymous_args = 0
426 | @ link register save eliminated.
427 | str fp, [sp, #-4]!
428 | add fp, sp, #0
429 | .syntax divided
430 | @ 173 "/Users/neroyang/project/Ceno-RTOS/board/arch/arm32/ek-TM4C123gxl/TM4C123GH6PM/ceno_os/src/uart_debug.c" 1
431 | MOV r0, r15
432 | BL uart_debug_print_i32
433 | MOV r0, #10
434 | BL uart_debug_print_char
435 | MOV r0, pc
436 | BL uart_debug_print_i32
437 | MOV r0, lr
438 | BL uart_debug_print_i32
439 | MOV r0, r12
440 | BL uart_debug_print_i32
441 | MOV r0, r3
442 | BL uart_debug_print_i32
443 | MOV r0, r2
444 | BL uart_debug_print_i32
445 | MOV r0, r0
446 | BL uart_debug_print_i32
447 | MOV r0, r11
448 | BL uart_debug_print_i32
449 | MOV r0, r10
450 | BL uart_debug_print_i32
451 | MOV r0, r9
452 | BL uart_debug_print_i32
453 | MOV r0, r8
454 | BL uart_debug_print_i32
455 | MOV r0, r7
456 | BL uart_debug_print_i32
457 | MOV r0, r6
458 | BL uart_debug_print_i32
459 | MOV r0, r5
460 | BL uart_debug_print_i32
461 | MOV r0, r4
462 | BL uart_debug_print_i32
463 |
464 | @ 0 "" 2
465 | .arm
466 | .syntax unified
467 | nop
468 | add sp, fp, #0
469 | @ sp needed
470 | ldr fp, [sp], #4
471 | bx lr
472 | .size uart_debug_print_os_register, .-uart_debug_print_os_register
473 | .ident "GCC: (GNU Tools for Arm Embedded Processors 7-2018-q2-update) 7.3.1 20180622 (release) [ARM/embedded-7-branch revision 261907]"
474 |
--------------------------------------------------------------------------------