1201 lines
38 KiB
Python
Executable File
1201 lines
38 KiB
Python
Executable File
#! /usr/bin/env python
|
|
#
|
|
# sysgen - System Generator
|
|
#
|
|
#
|
|
# Copyright (c) 2015, Wind River Systems, Inc.
|
|
#
|
|
# Redistribution and use in source and binary forms, with or without
|
|
# modification, are permitted provided that the following conditions are met:
|
|
#
|
|
# 1) Redistributions of source code must retain the above copyright notice,
|
|
# this list of conditions and the following disclaimer.
|
|
#
|
|
# 2) Redistributions in binary form must reproduce the above copyright notice,
|
|
# this list of conditions and the following disclaimer in the documentation
|
|
# and/or other materials provided with the distribution.
|
|
#
|
|
# 3) Neither the name of Wind River Systems nor the names of its contributors
|
|
# may be used to endorse or promote products derived from this software without
|
|
# specific prior written permission.
|
|
#
|
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
|
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
# POSSIBILITY OF SUCH DAMAGE.
|
|
#
|
|
|
|
# Arguments:
|
|
# - name of MDEF file
|
|
# - name of directory for output files (optional)
|
|
|
|
# Generates:
|
|
# - kernel_main.c file
|
|
# - kernel_main.h file (local copy)
|
|
# - micro_private_types.h file (local copy)
|
|
# - zephyr.h file
|
|
|
|
import os
|
|
import sys
|
|
import subprocess
|
|
|
|
# global variables describing system
|
|
|
|
num_kargs = 0
|
|
num_timers = 0
|
|
num_prios = 0
|
|
|
|
task_list = []
|
|
event_list = []
|
|
mutex_list = []
|
|
sema_list = []
|
|
fifo_list = []
|
|
pipe_list = []
|
|
mbx_list = []
|
|
map_list = []
|
|
pool_list = []
|
|
|
|
driver_list = []
|
|
|
|
group_dictionary = {}
|
|
group_key_list = []
|
|
|
|
# global variables used during generation of output files
|
|
|
|
do_not_edit_warning = \
|
|
"\n\n\n/* THIS FILE IS AUTOGENERATED -- DO NOT MODIFY! */\n\n\n"
|
|
|
|
copyright = \
|
|
"/*\n" + \
|
|
" * Copyright (c) 2015 Wind River Systems, Inc.\n" + \
|
|
" *\n" + \
|
|
" * Redistribution and use in source and binary forms," + \
|
|
" with or without\n" + \
|
|
" * modification, are permitted provided that the following conditions" + \
|
|
" are met:\n" + \
|
|
" *\n" + \
|
|
" * 1) Redistributions of source code must retain" + \
|
|
" the above copyright notice,\n" + \
|
|
" * this list of conditions and the following disclaimer.\n" + \
|
|
" *\n" + \
|
|
" * 2) Redistributions in binary form must reproduce" + \
|
|
" the above copyright notice,\n" + \
|
|
" * this list of conditions and the following disclaimer" + \
|
|
" in the documentation\n" + \
|
|
" * and/or other materials provided with the distribution.\n" + \
|
|
" *\n" + \
|
|
" * 3) Neither the name of Wind River Systems nor the names" + \
|
|
" of its contributors\n" + \
|
|
" * may be used to endorse or promote products derived" + \
|
|
" from this software without\n" + \
|
|
" * specific prior written permission.\n" + \
|
|
" *\n" + \
|
|
" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS" + \
|
|
" AND CONTRIBUTORS \"AS IS\"\n" + \
|
|
" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING," + \
|
|
" BUT NOT LIMITED TO, THE\n" + \
|
|
" * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS" + \
|
|
" FOR A PARTICULAR PURPOSE\n" + \
|
|
" * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER" + \
|
|
" OR CONTRIBUTORS BE\n" + \
|
|
" * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL," + \
|
|
" EXEMPLARY, OR\n" + \
|
|
" * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO," + \
|
|
" PROCUREMENT OF\n" + \
|
|
" * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;" + \
|
|
" OR BUSINESS\n" + \
|
|
" * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY," + \
|
|
" WHETHER IN\n" + \
|
|
" * CONTRACT, STRICT LIABILITY, OR TORT" + \
|
|
" (INCLUDING NEGLIGENCE OR OTHERWISE)\n" + \
|
|
" * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE," + \
|
|
" EVEN IF ADVISED OF THE\n" + \
|
|
" * POSSIBILITY OF SUCH DAMAGE.\n" + \
|
|
" */\n"
|
|
|
|
output_dir = ""
|
|
|
|
|
|
def get_output_dir():
|
|
""" Handle optional output directory argument """
|
|
|
|
global output_dir
|
|
if len(sys.argv) > 2:
|
|
output_dir = sys.argv[2]
|
|
|
|
|
|
def write_file(filename, contents):
|
|
""" Create file using specified name and contents """
|
|
|
|
f = open(filename, 'w') # overwrites file if it already exists
|
|
f.write(contents)
|
|
f.close()
|
|
|
|
|
|
#
|
|
# ERROR HANDLING
|
|
#
|
|
|
|
|
|
def sysgen_error(msg):
|
|
print("\n*** sysgen error: " + msg + "\n")
|
|
sys.exit(1)
|
|
|
|
|
|
def error_arg_count(line):
|
|
sysgen_error("invalid number of arguments on following line\n" + line)
|
|
|
|
|
|
#
|
|
# CREATE INTERNAL REPRESENTATION OF SYSTEM
|
|
#
|
|
|
|
|
|
def mdef_parse():
|
|
""" Parse MDEF file """
|
|
|
|
global num_kargs
|
|
global num_timers
|
|
global num_prios
|
|
|
|
# read file contents in a single shot
|
|
with open(sys.argv[1], 'r') as infile:
|
|
data = infile.read()
|
|
|
|
# create list of the lines, breaking at line boundaries
|
|
my_list = data.splitlines()
|
|
|
|
# process each line
|
|
for line in my_list:
|
|
words = line.split()
|
|
|
|
if (len(words) == 0):
|
|
continue # ignore blank line
|
|
|
|
if (words[0][0] == "%"):
|
|
continue # ignore comment line
|
|
|
|
if (words[0] == "CONFIG"):
|
|
if (len(words) != 4):
|
|
error_arg_count(line)
|
|
num_kargs = int(words[1])
|
|
num_timers = int(words[2])
|
|
num_prios = int(words[3])
|
|
continue
|
|
|
|
if (words[0] == "TASK"):
|
|
if (len(words) != 6):
|
|
error_arg_count(line)
|
|
task_list.append((words[1], int(words[2]), words[3],
|
|
int(words[4]), words[5]))
|
|
continue
|
|
|
|
if (words[0] == "TASKGROUP"):
|
|
if (len(words) != 2):
|
|
error_arg_count(line)
|
|
if words[1] in group_dictionary:
|
|
continue # ignore re-definition of a task group
|
|
group_bitmask = 1 << len(group_dictionary)
|
|
group_dictionary[words[1]] = group_bitmask
|
|
group_key_list.append(words[1])
|
|
continue
|
|
|
|
if (words[0] == "EVENT"):
|
|
if (len(words) != 3):
|
|
error_arg_count(line)
|
|
event_list.append((words[1], words[2]))
|
|
continue
|
|
|
|
if (words[0] == "SEMA"):
|
|
if (len(words) != 2):
|
|
error_arg_count(line)
|
|
sema_list.append((words[1],))
|
|
continue
|
|
|
|
if (words[0] == "MUTEX"):
|
|
if (len(words) != 2):
|
|
error_arg_count(line)
|
|
mutex_list.append((words[1],))
|
|
continue
|
|
|
|
if (words[0] == "FIFO"):
|
|
if (len(words) != 4):
|
|
error_arg_count(line)
|
|
fifo_list.append((words[1], int(words[2]), int(words[3])))
|
|
continue
|
|
|
|
if (words[0] == "PIPE"):
|
|
if (len(words) != 3):
|
|
error_arg_count(line)
|
|
pipe_list.append((words[1], int(words[2])))
|
|
continue
|
|
|
|
if (words[0] == "MAILBOX"):
|
|
if (len(words) != 2):
|
|
error_arg_count(line)
|
|
mbx_list.append((words[1],))
|
|
continue
|
|
|
|
if (words[0] == "MAP"):
|
|
if (len(words) != 4):
|
|
error_arg_count(line)
|
|
map_list.append((words[1], int(words[2]), int(words[3])))
|
|
continue
|
|
|
|
if (words[0] == "POOL"):
|
|
if (len(words) != 5):
|
|
error_arg_count(line)
|
|
pool_list.append((words[1], int(words[2]), int(words[3]),
|
|
int(words[4])))
|
|
continue
|
|
|
|
if (words[0] == "TIMERDRIVER"):
|
|
if (len(words) == 1):
|
|
error_arg_count(line)
|
|
if (num_timers == 0):
|
|
continue # ignore timer driver for a tickless microkernel
|
|
start_quote = line.find("'")
|
|
end_quote = line.rfind("'")
|
|
driver_list.append(line[start_quote + 1:end_quote])
|
|
continue
|
|
|
|
if (words[0] == "USERDRIVER"):
|
|
if (len(words) == 1):
|
|
error_arg_count(line)
|
|
start_quote = line.find("'")
|
|
end_quote = line.rfind("'")
|
|
driver_list.append(line[start_quote + 1:end_quote])
|
|
continue
|
|
|
|
sysgen_error("unrecognized keyword %s on following line\n%s" %
|
|
(words[0], line))
|
|
|
|
|
|
#
|
|
# GENERATE kernel_main.c FILE
|
|
#
|
|
|
|
|
|
kernel_main_c_data = ""
|
|
|
|
kernel_main_c_filename_str = \
|
|
"/* kernel_main.c - microkernel mainline and kernel objects */\n\n"
|
|
|
|
|
|
def kernel_main_c_out(string):
|
|
""" Append a string to kernel_main.c """
|
|
|
|
global kernel_main_c_data
|
|
kernel_main_c_data += string
|
|
|
|
|
|
def kernel_main_c_header():
|
|
""" Generate initial portion of kernel_main.c """
|
|
|
|
kernel_main_c_out(
|
|
kernel_main_c_filename_str +
|
|
copyright +
|
|
do_not_edit_warning +
|
|
"\n" +
|
|
"#include <zephyr.h>\n" +
|
|
"#include <drivers/system_timer.h>\n" +
|
|
"#include <micro_private_types.h>\n" +
|
|
"#include <kernel_main.h>\n" +
|
|
"#include <toolchain.h>\n" +
|
|
"#include <sections.h>\n")
|
|
|
|
|
|
def kernel_main_c_kargs():
|
|
""" Generate command packet variables """
|
|
|
|
# command packets
|
|
|
|
kernel_main_c_out("\n" +
|
|
"struct k_args _k_server_command_packets[%s] =\n" % (num_kargs) +
|
|
"{\n" +
|
|
" {NULL, NULL, 0, 0, (K_COMM) UNDEFINED},\n")
|
|
for i in range(1, num_kargs - 1):
|
|
kernel_main_c_out(
|
|
" {&_k_server_command_packets[%d], " % (i - 1) +
|
|
"NULL, 0, 0, (K_COMM) UNDEFINED},\n")
|
|
kernel_main_c_out(
|
|
" {&_k_server_command_packets[%d], " % (num_kargs - 2) +
|
|
"NULL, 0, 0, (K_COMM) UNDEFINED}\n" +
|
|
"};\n")
|
|
|
|
# linked list of free command packets
|
|
|
|
kernel_main_c_out("\n" +
|
|
"struct nano_lifo _k_server_command_packet_free = " +
|
|
"{{NULL, &_k_server_command_packet_free.wait_q.head}, " +
|
|
"(void *) &_k_server_command_packets[%d]};\n" % (num_kargs - 1))
|
|
|
|
|
|
def kernel_main_c_timers():
|
|
""" Generate timer system variables """
|
|
|
|
if (num_timers == 0):
|
|
return
|
|
|
|
# timer descriptors
|
|
|
|
kernel_main_c_out("\n" +
|
|
"struct k_timer _k_timer_blocks[%d] =\n" % (num_timers) +
|
|
"{\n" +
|
|
" {NULL, NULL, 0, 0, (struct k_args *)0xffffffff},\n")
|
|
for i in range(1, num_timers - 1):
|
|
kernel_main_c_out(
|
|
" {&_k_timer_blocks[%d], " % (i - 1) +
|
|
"NULL, 0, 0, (struct k_args *)0xffffffff},\n")
|
|
kernel_main_c_out(
|
|
" {&_k_timer_blocks[%d], " % (num_timers - 2) +
|
|
"NULL, 0, 0, (struct k_args *)0xffffffff}\n" +
|
|
"};\n")
|
|
|
|
# linked list of free timers
|
|
|
|
kernel_main_c_out("\n" +
|
|
"struct nano_lifo _k_timer_free = " +
|
|
"{{NULL, &_k_timer_free.wait_q.head}, " +
|
|
"(void *) &_k_timer_blocks[%d]};\n" % (num_timers - 1))
|
|
|
|
|
|
def kernel_main_c_tasks():
|
|
""" Generate task variables """
|
|
|
|
global num_prios
|
|
|
|
total_tasks = len(task_list) + 1
|
|
|
|
# task global variables
|
|
|
|
kernel_main_c_out("\nint _k_task_count = %d;\n" % (total_tasks - 1))
|
|
|
|
# task stack areas
|
|
|
|
kernel_main_c_out("\n")
|
|
for task in task_list:
|
|
kernel_main_c_out("char __noinit __stack __%s_stack[%d];\n" %
|
|
(task[0], task[3]))
|
|
|
|
kernel_main_c_out("extern char main_task_stack[CONFIG_MAIN_STACK_SIZE];\n")
|
|
|
|
# declare task entry points
|
|
|
|
kernel_main_c_out("\n")
|
|
for task in task_list:
|
|
kernel_main_c_out("extern void %s(void);\n" % task[2])
|
|
|
|
# task descriptors (including one for idle task)
|
|
|
|
kernel_main_c_out("\n" +
|
|
"struct k_proc _k_task_list[%d] =\n" % (total_tasks) +
|
|
"{\n")
|
|
ident = 0x00010000
|
|
for task in task_list:
|
|
prio = task[1]
|
|
entry = task[2]
|
|
size = task[3]
|
|
|
|
stack = "__" + task[0] + "_stack"
|
|
|
|
# create bitmask of group(s) task belongs to
|
|
group_bitmask = 0
|
|
group_set = task[4][1:len(task[4]) - 1] # drop [] surrounding groups
|
|
if (group_set != ""):
|
|
group_list = group_set.split(',')
|
|
for group in group_list:
|
|
group_bitmask |= group_dictionary[group]
|
|
|
|
# invert bitmask to convert SYS indication to non-SYS indication
|
|
#
|
|
# NOTE: There actually is no SYS group; instead, there is a non-SYS
|
|
# group that all tasks belong to unless they specify the 'SYS' name.
|
|
# This approach allows the kernel to easily suspend all non-SYS tasks
|
|
# during debugging, while minimizing the number of task entries that
|
|
# have to explicitly indicate their SYS/non-SYS status.
|
|
group_bitmask ^= group_dictionary['SYS']
|
|
|
|
kernel_main_c_out(
|
|
" {NULL, NULL, %d, %#010x, " % (prio, ident) +
|
|
"0x00000001, %#010x,\n" % (group_bitmask) +
|
|
"%s, %s, %d, (taskabortfunction)NULL},\n" % (entry, stack, size))
|
|
ident += 1
|
|
|
|
kernel_main_c_out(" {NULL, NULL, %d, 0x00000000, " % (num_prios - 1) +
|
|
"0x00000000, 0x00000000,\n" +
|
|
"(taskstartfunction)NULL, main_task_stack, CONFIG_MAIN_STACK_SIZE, " +
|
|
"(taskabortfunction)NULL}\n")
|
|
kernel_main_c_out("};\n")
|
|
|
|
# currently scheduled task (idle task)
|
|
|
|
kernel_main_c_out("\n" +
|
|
"struct k_proc * _k_current_task = &_k_task_list[%d];\n" %
|
|
(total_tasks - 1))
|
|
|
|
|
|
def kernel_main_c_priorities():
|
|
""" Generate task scheduling variables """
|
|
|
|
global num_prios
|
|
|
|
total_tasks = len(task_list) + 1
|
|
|
|
# priority queue descriptors (lowest priority queue contains idle task)
|
|
|
|
kernel_main_c_out("\n" +
|
|
"struct k_tqhd _k_task_priority_list[%d] =\n" % (num_prios) +
|
|
"{\n")
|
|
for i in range(1, num_prios):
|
|
kernel_main_c_out(
|
|
" {NULL, (struct k_proc *)&_k_task_priority_list[%d]},\n" %
|
|
(i - 1))
|
|
kernel_main_c_out(
|
|
" {&_k_task_list[%d], &_k_task_list[%d]}\n" %
|
|
(total_tasks - 1, total_tasks - 1) +
|
|
"};\n")
|
|
|
|
# active priority queue (idle task's queue)
|
|
|
|
kernel_main_c_out("\n" +
|
|
"struct k_tqhd * K_Prio = &_k_task_priority_list[%d];\n" %
|
|
(num_prios - 1))
|
|
|
|
# priority queue bit map (indicates which priority queues are non-empty;
|
|
# initially only the idle task's queue has a runnable task)
|
|
|
|
num_bit_maps = ((num_prios + 31) // 32)
|
|
|
|
kernel_main_c_out("\n" +
|
|
"uint32_t _k_task_priority_bitmap[%d] = {" % (num_bit_maps))
|
|
for i in range(1, num_bit_maps):
|
|
kernel_main_c_out("0, ")
|
|
kernel_main_c_out("(1u << %d)};\n" % ((num_prios - 1) & 0x1f))
|
|
|
|
|
|
def kernel_main_c_events():
|
|
""" Generate event variables """
|
|
|
|
total_events = 4 + len(event_list)
|
|
|
|
# event descriptors
|
|
|
|
kernel_main_c_out("\n" +
|
|
"struct evstr _k_event_list[%d] =\n" % (total_events) +
|
|
"{\n")
|
|
# pre-defined events
|
|
if (num_timers > 0):
|
|
kernel_main_c_out(
|
|
" {0, (kevent_handler_t)_k_ticker, " +
|
|
"(struct k_args *)NULL, 0},\n")
|
|
else:
|
|
kernel_main_c_out(
|
|
" {0, (kevent_handler_t)NULL, (struct k_args *)NULL, 0},\n")
|
|
kernel_main_c_out(
|
|
" {0, (kevent_handler_t)NULL, (struct k_args *)NULL, 0},\n" +
|
|
" {0, (kevent_handler_t)NULL, (struct k_args *)NULL, 0},\n" +
|
|
" {0, (kevent_handler_t)NULL, (struct k_args *)NULL, 0},\n"
|
|
)
|
|
# project-specific events
|
|
for event in event_list:
|
|
kernel_main_c_out(
|
|
" {0, (kevent_handler_t)%s, (struct k_args *)NULL, 0},\n" %
|
|
(event[1]))
|
|
kernel_main_c_out("};\n")
|
|
|
|
# number of events
|
|
|
|
kernel_main_c_out("\n" +
|
|
"const int _k_num_events = %d;\n" % (total_events))
|
|
|
|
# event object identifiers (for project-defined events only)
|
|
|
|
if (len(event_list) > 0):
|
|
kernel_main_c_out("\n")
|
|
|
|
for event_name in event_list:
|
|
kernel_main_c_out(
|
|
"const kevent_t %s_objId = %s;\n" %
|
|
(event_name[0], event_name[0]))
|
|
|
|
|
|
def kernel_main_c_mutexes():
|
|
""" Generate mutex variables """
|
|
|
|
total_mutexes = len(mutex_list)
|
|
|
|
if (total_mutexes == 0):
|
|
kernel_main_c_out("\nstruct mutex_struct * _k_mutex_list = NULL;\n")
|
|
return
|
|
|
|
# mutex descriptors
|
|
|
|
kernel_main_c_out("\n" +
|
|
"struct mutex_struct _k_mutex_list[%s] =\n" % (total_mutexes) +
|
|
"{\n")
|
|
for mutex in mutex_list:
|
|
kernel_main_c_out(" {ANYTASK, 64, 64, 0, NULL, 0, 0},\n")
|
|
kernel_main_c_out("};\n")
|
|
kernel_main_c_out("\n")
|
|
|
|
# mutex object identifiers
|
|
|
|
for mutex in mutex_list:
|
|
name = mutex[0]
|
|
kernel_main_c_out("const kmutex_t %s_objId = %s;\n" % (name, name))
|
|
|
|
|
|
def kernel_main_c_semas():
|
|
""" Generate semaphore variables """
|
|
|
|
total_semas = len(sema_list)
|
|
|
|
if (total_semas == 0):
|
|
kernel_main_c_out("\nstruct sem_struct * _k_sem_list = NULL;\n")
|
|
return
|
|
|
|
# semaphore descriptors
|
|
|
|
kernel_main_c_out("\n" +
|
|
"struct sem_struct _k_sem_list[%s] =\n" % (total_semas) +
|
|
"{\n")
|
|
for semaphore in sema_list:
|
|
kernel_main_c_out(" {NULL, 0, 0},\n")
|
|
kernel_main_c_out("};\n")
|
|
|
|
|
|
def kernel_main_c_fifos():
|
|
""" Generate FIFO variables """
|
|
|
|
total_fifos = len(fifo_list)
|
|
|
|
if (total_fifos == 0):
|
|
kernel_main_c_out("\nstruct que_struct * _k_fifo_list = NULL;\n")
|
|
return
|
|
|
|
# FIFO buffers
|
|
|
|
kernel_main_c_out("\n")
|
|
|
|
for fifo in fifo_list:
|
|
kernel_main_c_out(
|
|
"char __noinit __%s_buffer[%d];\n" % (fifo[0], fifo[1] * fifo[2]))
|
|
|
|
# FIFO descriptors
|
|
|
|
kernel_main_c_out("\n" +
|
|
"struct que_struct _k_fifo_list[%s] =\n" % (total_fifos) +
|
|
"{\n"
|
|
)
|
|
for fifo in fifo_list:
|
|
depth = fifo[1]
|
|
width = fifo[2]
|
|
buffer = "__" + fifo[0] + "_buffer"
|
|
kernel_main_c_out(
|
|
" {%d, %d, %s, %s + (%d * %d),\n" %
|
|
(depth, width, buffer, buffer, depth, width) +
|
|
"%s, %s, NULL, 0, 0, 0},\n" %
|
|
(buffer, buffer))
|
|
kernel_main_c_out("};\n")
|
|
|
|
|
|
def kernel_main_c_pipes():
|
|
""" Generate pipe variables """
|
|
|
|
total_pipes = len(pipe_list)
|
|
|
|
# pipe global variables
|
|
|
|
kernel_main_c_out("\nint _k_pipe_count = %d;\n" % (total_pipes))
|
|
|
|
if (total_pipes == 0):
|
|
kernel_main_c_out("\nstruct pipe_struct * _k_pipe_list = NULL;\n")
|
|
return
|
|
|
|
# pipe buffers
|
|
|
|
kernel_main_c_out("\n")
|
|
|
|
for pipe in pipe_list:
|
|
kernel_main_c_out(
|
|
"char __noinit __%s_buffer[%d];\n" % (pipe[0], pipe[1]))
|
|
|
|
# pipe descriptors
|
|
|
|
kernel_main_c_out("\n" +
|
|
"struct pipe_struct _k_pipe_list[%d] =\n" % (total_pipes) +
|
|
"{\n")
|
|
for pipe in pipe_list:
|
|
size = pipe[1]
|
|
buffer = "__" + pipe[0] + "_buffer"
|
|
kernel_main_c_out(" {%d, %s},\n" % (size, buffer))
|
|
kernel_main_c_out("};\n")
|
|
|
|
|
|
def kernel_main_c_mailboxes():
|
|
""" Generate mailbox variables """
|
|
|
|
total_mbxs = len(mbx_list)
|
|
|
|
if (total_mbxs == 0):
|
|
kernel_main_c_out("\nstruct mbx_struct * _k_mbox_list = NULL;\n")
|
|
return
|
|
|
|
# mailbox descriptors
|
|
|
|
kernel_main_c_out("\n" +
|
|
"struct mbx_struct _k_mbox_list[%d] =\n" % (total_mbxs) +
|
|
"{\n")
|
|
for mbx in mbx_list:
|
|
kernel_main_c_out(" {NULL, NULL, 0},\n")
|
|
kernel_main_c_out("};\n")
|
|
|
|
|
|
def kernel_main_c_maps():
|
|
""" Generate memory map variables """
|
|
|
|
total_maps = len(map_list)
|
|
|
|
# map global variables
|
|
|
|
kernel_main_c_out("\nint _k_mem_map_count = %d;\n" % (total_maps))
|
|
|
|
if (total_maps == 0):
|
|
kernel_main_c_out("\nstruct map_struct * _k_mem_map_list = NULL;\n")
|
|
return
|
|
|
|
# memory map buffers
|
|
|
|
kernel_main_c_out("\n")
|
|
|
|
for map in map_list:
|
|
blocks = map[1]
|
|
block_size = map[2]
|
|
kernel_main_c_out("char __noinit __MAP_%s_buffer[%d];\n" %
|
|
(map[0], blocks * block_size))
|
|
|
|
# memory map descriptors
|
|
|
|
kernel_main_c_out(
|
|
"\nstruct map_struct _k_mem_map_list[%d] =\n{\n" % (total_maps))
|
|
for map in map_list:
|
|
blocks = map[1]
|
|
block_size = map[2]
|
|
kernel_main_c_out(" { %d, %d, __MAP_%s_buffer },\n" %
|
|
(blocks, block_size, map[0]))
|
|
kernel_main_c_out("};\n")
|
|
|
|
|
|
def kernel_main_c_pools():
|
|
""" Generate memory pool variables """
|
|
|
|
total_pools = len(pool_list)
|
|
|
|
# pool global variables
|
|
|
|
kernel_main_c_out("\nint _k_mem_pool_count = %d;\n" % (total_pools))
|
|
|
|
if (total_pools == 0):
|
|
kernel_main_c_out("\nstruct pool_struct * _k_mem_pool_list = NULL;\n")
|
|
return
|
|
|
|
# start accumulating memory pool descriptor info
|
|
|
|
pool_descriptors = "\nstruct pool_struct _k_mem_pool_list[%d] =\n{\n" % \
|
|
(total_pools)
|
|
ident = 0x00010000
|
|
|
|
for pool in pool_list:
|
|
|
|
kernel_main_c_out("\n")
|
|
|
|
# create local variables relating to current pool
|
|
|
|
min_block_size = pool[1]
|
|
max_block_size = pool[2]
|
|
num_maximal_blocks = pool[3]
|
|
total_memory = max_block_size * num_maximal_blocks
|
|
buffer = "__" + pool[0] + "_buffer"
|
|
frag_table = "fragtab_%#010x" % ident
|
|
|
|
# determine block sizes used by pool (including actual minimum size)
|
|
|
|
frag_size_list = [max_block_size]
|
|
while (ident != 0): # loop forever
|
|
min_block_size_actual = frag_size_list[len(frag_size_list) - 1]
|
|
min_block_size_proposed = min_block_size_actual / 4
|
|
if (min_block_size_proposed < min_block_size):
|
|
break
|
|
frag_size_list.append(min_block_size_proposed)
|
|
frag_levels = len(frag_size_list)
|
|
|
|
# determine size of block status arrays
|
|
# - largest size gets special handling
|
|
# - remainder of algorithm is a complete mystery ...
|
|
|
|
block_status_sizes = [(num_maximal_blocks + 3) / 4]
|
|
block_status_size_to_use = num_maximal_blocks
|
|
for index in range(1, frag_levels):
|
|
block_status_sizes.append(block_status_size_to_use)
|
|
block_status_size_to_use *= 4
|
|
|
|
# generate block status areas
|
|
|
|
for index in range(0, frag_levels):
|
|
kernel_main_c_out(
|
|
"struct block_stat blockstatus_%#010x_%d[%d];\n" %
|
|
(ident, index, block_status_sizes[index]))
|
|
|
|
# generate memory pool fragmentation descriptor
|
|
|
|
kernel_main_c_out("\nstruct pool_block %s[%d] =\n{\n" %
|
|
(frag_table, frag_levels))
|
|
for index in range(0, frag_levels):
|
|
kernel_main_c_out(" { %d, %d, blockstatus_%#010x_%d},\n" %
|
|
(frag_size_list[index], block_status_sizes[index],
|
|
ident, index))
|
|
kernel_main_c_out("};\n")
|
|
|
|
# generate memory pool buffer
|
|
|
|
kernel_main_c_out("\nchar __noinit %s[%d];\n" % (buffer, total_memory))
|
|
|
|
# append memory pool descriptor info
|
|
|
|
pool_descriptors += " {%d, %d, 2, %d, %d, %d, NULL, %s, %s},\n" % \
|
|
(max_block_size, min_block_size_actual, total_memory,
|
|
num_maximal_blocks, frag_levels, frag_table, buffer)
|
|
|
|
ident += 1
|
|
|
|
# generate memory pool descriptor info
|
|
|
|
pool_descriptors += "};\n"
|
|
kernel_main_c_out(pool_descriptors)
|
|
|
|
|
|
def kernel_main_c_kernel_services():
|
|
""" Generate kernel services function table """
|
|
|
|
# initialize table with info for all possible kernel services
|
|
|
|
func_table = [
|
|
"/* 0 */ _k_nop,", # required
|
|
"/* 1 */ _k_movedata_request,", # required
|
|
"/* 2 */ (kernelfunc) NULL,", # unused
|
|
"/* 3 */ (kernelfunc) NULL,", # unused
|
|
"/* 4 */ _k_offload_to_fiber,", # required
|
|
"/* 5 */ _k_workload_get,", # required
|
|
"/* 6 */ _k_sem_signal,", # depends on semaphores
|
|
"/* 7 */ _k_sem_group_signal,", # depends on semaphores
|
|
"/* 8 */ _k_sem_reset,", # depends on semaphores
|
|
"/* 9 */ _k_sem_group_reset,", # depends on semaphores
|
|
"/* 10 */ _k_sem_wait_request,", # depends on semaphores
|
|
"/* 11 */ _k_sem_wait_reply,", # depends on semaphores
|
|
"/* 12 */ _k_sem_wait_reply,", # depends on semaphores and
|
|
# timers
|
|
"/* 13 */ _k_sem_group_wait_any,", # depends on semaphores
|
|
"/* 14 */ _k_sem_group_wait_request,", # depends on semaphores
|
|
"/* 15 */ _k_sem_group_ready,", # depends on semaphores
|
|
"/* 16 */ _k_sem_group_wait_cancel,", # depends on semaphores
|
|
"/* 17 */ _k_sem_group_wait_accept,", # depends on semaphores
|
|
"/* 18 */ _k_sem_group_wait,", # depends on semaphores
|
|
"/* 19 */ _k_sem_group_wait_timeout,", # depends on semaphores
|
|
# (but not timers)
|
|
"/* 20 */ _k_sem_inquiry,", # depends on semaphores
|
|
"/* 21 */ _k_mutex_lock_request,", # depends on mutexes
|
|
"/* 22 */ _k_mutex_lock_reply,", # depends on mutexes
|
|
"/* 23 */ _k_mutex_lock_reply,", # depends on mutexes and
|
|
# timers
|
|
"/* 24 */ _k_mutex_unlock,", # depends on mutexes
|
|
"/* 25 */ _k_fifo_enque_request,", # depends on FIFOs
|
|
"/* 26 */ _k_fifo_enque_reply,", # depends on FIFOs
|
|
"/* 27 */ _k_fifo_enque_reply,", # depends on FIFOs and timers
|
|
"/* 28 */ _k_fifo_deque_request,", # depends on FIFOs
|
|
"/* 29 */ _k_fifo_deque_reply,", # depends on FIFOs
|
|
"/* 30 */ _k_fifo_deque_reply,", # depends on FIFOs and timers
|
|
"/* 31 */ _k_fifo_ioctl,", # depends on FIFOs
|
|
"/* 32 */ _k_mbox_send_request,", # depends on mailboxes
|
|
"/* 33 */ _k_mbox_send_reply,", # depends on mailboxes and
|
|
# timers
|
|
"/* 34 */ _k_mbox_send_ack,", # depends on mailboxes
|
|
"/* 35 */ _k_mbox_send_data,", # depends on mailboxes
|
|
"/* 36 */ _k_mbox_receive_request,", # depends on mailboxes
|
|
"/* 37 */ _k_mbox_receive_reply,", # depends on mailboxes and
|
|
# timers
|
|
"/* 38 */ _k_mbox_receive_ack,", # depends on mailboxes
|
|
"/* 39 */ _k_mbox_receive_data,", # depends on mailboxes
|
|
"/* 40 */ _k_time_elapse,", # depends on timers
|
|
"/* 41 */ _k_task_sleep,", # depends on timers
|
|
"/* 42 */ _k_task_wakeup,", # depends on timers
|
|
"/* 43 */ _k_task_op,", # required
|
|
"/* 44 */ _k_task_group_op,", # required
|
|
"/* 45 */ _k_task_priority_set,", # required
|
|
"/* 46 */ _k_task_yield,", # required
|
|
"/* 47 */ _k_mem_map_alloc,", # depends on memory maps
|
|
"/* 48 */ _k_mem_map_dealloc,", # depends on memory maps
|
|
"/* 49 */ _k_timer_alloc,", # depends on timers
|
|
"/* 50 */ _k_timer_dealloc,", # depends on timers
|
|
"/* 51 */ _k_timer_start,", # depends on timers
|
|
"/* 52 */ _k_timer_stop,", # depends on timers
|
|
"/* 53 */ _k_mem_map_alloc_timeout,", # depends on memory maps and
|
|
# timers
|
|
"/* 54 */ (kernelfunc) NULL,", # unused
|
|
"/* 55 */ (kernelfunc) NULL,", # unused
|
|
"/* 56 */ (kernelfunc) NULL,", # unused
|
|
"/* 57 */ (kernelfunc) NULL,", # unused
|
|
"/* 58 */ _k_event_test,", # required
|
|
"/* 59 */ _k_event_handler_set,", # required
|
|
"/* 60 */ _k_event_signal,", # required
|
|
"/* 61 */ _k_mem_pool_block_get,", # depends on memory pools
|
|
"/* 62 */ _k_mem_pool_block_release,", # depends on memory pools
|
|
"/* 63 */ _k_block_waiters_get,", # depends on memory pools
|
|
"/* 64 */ _k_mem_pool_block_get_timeout_handle,", # depends on memory pools
|
|
# and timers
|
|
"/* 65 */ _k_defrag,", # depends on memory pools
|
|
"/* 66 */ (kernelfunc) NULL,", # unused
|
|
"/* 67 */ (kernelfunc) NULL,", # unused
|
|
"/* 68 */ (kernelfunc) NULL,", # unused
|
|
"/* 69 */ (kernelfunc) NULL,", # unused
|
|
"/* 70 */ (kernelfunc) NULL,", # unused
|
|
"/* 71 */ (kernelfunc) NULL,", # unused
|
|
"/* 72 */ K_ChSendReq,", # depends on pipes
|
|
"/* 73 */ K_ChSendTmo,", # depends on pipes and timers
|
|
"/* 74 */ K_ChSendRpl,", # depends on pipes
|
|
"/* 75 */ K_ChSendAck,", # depends on pipes
|
|
"/* 76 */ K_ChRecvReq,", # depends on pipes
|
|
"/* 77 */ K_ChRecvTmo,", # depends on pipes and timers
|
|
"/* 78 */ K_ChRecvRpl,", # depends on pipes
|
|
"/* 79 */ K_ChRecvAck,", # depends on pipes
|
|
"/* 80 */ K_ChMovedAck,", # depends on pipes
|
|
"/* 81 */ _k_event_test_timeout" # depends on timers
|
|
]
|
|
|
|
# eliminate table entries for kernel services that project doesn't utilize
|
|
# (note: some entries can be eliminated for more than one reason)
|
|
|
|
if (len(sema_list) == 0):
|
|
func_table[6] = "/* 6 */ (kernelfunc) NULL,"
|
|
func_table[7] = "/* 7 */ (kernelfunc) NULL,"
|
|
func_table[8] = "/* 8 */ (kernelfunc) NULL,"
|
|
func_table[9] = "/* 9 */ (kernelfunc) NULL,"
|
|
func_table[10] = "/* 10 */ (kernelfunc) NULL,"
|
|
func_table[11] = "/* 11 */ (kernelfunc) NULL,"
|
|
func_table[12] = "/* 12 */ (kernelfunc) NULL,"
|
|
func_table[13] = "/* 13 */ (kernelfunc) NULL,"
|
|
func_table[14] = "/* 14 */ (kernelfunc) NULL,"
|
|
func_table[15] = "/* 15 */ (kernelfunc) NULL,"
|
|
func_table[16] = "/* 16 */ (kernelfunc) NULL,"
|
|
func_table[17] = "/* 17 */ (kernelfunc) NULL,"
|
|
func_table[18] = "/* 18 */ (kernelfunc) NULL,"
|
|
func_table[19] = "/* 19 */ (kernelfunc) NULL,"
|
|
func_table[20] = "/* 20 */ (kernelfunc) NULL,"
|
|
|
|
if (len(mutex_list) == 0):
|
|
func_table[21] = "/* 21 */ (kernelfunc) NULL,"
|
|
func_table[22] = "/* 22 */ (kernelfunc) NULL,"
|
|
func_table[23] = "/* 23 */ (kernelfunc) NULL,"
|
|
func_table[24] = "/* 24 */ (kernelfunc) NULL,"
|
|
|
|
if (len(fifo_list) == 0):
|
|
func_table[25] = "/* 25 */ (kernelfunc) NULL,"
|
|
func_table[26] = "/* 26 */ (kernelfunc) NULL,"
|
|
func_table[27] = "/* 27 */ (kernelfunc) NULL,"
|
|
func_table[28] = "/* 28 */ (kernelfunc) NULL,"
|
|
func_table[29] = "/* 29 */ (kernelfunc) NULL,"
|
|
func_table[30] = "/* 30 */ (kernelfunc) NULL,"
|
|
func_table[31] = "/* 31 */ (kernelfunc) NULL,"
|
|
|
|
if (len(mbx_list) == 0):
|
|
func_table[32] = "/* 32 */ (kernelfunc) NULL,"
|
|
func_table[33] = "/* 33 */ (kernelfunc) NULL,"
|
|
func_table[34] = "/* 34 */ (kernelfunc) NULL,"
|
|
func_table[35] = "/* 35 */ (kernelfunc) NULL,"
|
|
func_table[36] = "/* 36 */ (kernelfunc) NULL,"
|
|
func_table[37] = "/* 37 */ (kernelfunc) NULL,"
|
|
func_table[38] = "/* 38 */ (kernelfunc) NULL,"
|
|
func_table[39] = "/* 39 */ (kernelfunc) NULL,"
|
|
|
|
if (len(map_list) == 0):
|
|
func_table[47] = "/* 47 */ (kernelfunc) NULL,"
|
|
func_table[48] = "/* 48 */ (kernelfunc) NULL,"
|
|
func_table[53] = "/* 53 */ (kernelfunc) NULL,"
|
|
|
|
if (len(pool_list) == 0):
|
|
func_table[61] = "/* 61 */ (kernelfunc) NULL,"
|
|
func_table[62] = "/* 62 */ (kernelfunc) NULL,"
|
|
func_table[63] = "/* 63 */ (kernelfunc) NULL,"
|
|
func_table[64] = "/* 64 */ (kernelfunc) NULL,"
|
|
func_table[65] = "/* 65 */ (kernelfunc) NULL,"
|
|
|
|
if (len(pipe_list) == 0):
|
|
func_table[72] = "/* 72 */ (kernelfunc) NULL,"
|
|
func_table[73] = "/* 73 */ (kernelfunc) NULL,"
|
|
func_table[74] = "/* 74 */ (kernelfunc) NULL,"
|
|
func_table[75] = "/* 75 */ (kernelfunc) NULL,"
|
|
func_table[76] = "/* 76 */ (kernelfunc) NULL,"
|
|
func_table[77] = "/* 77 */ (kernelfunc) NULL,"
|
|
func_table[78] = "/* 78 */ (kernelfunc) NULL,"
|
|
func_table[79] = "/* 79 */ (kernelfunc) NULL,"
|
|
func_table[80] = "/* 80 */ (kernelfunc) NULL,"
|
|
|
|
if (num_timers == 0):
|
|
func_table[12] = "/* 12 */ (kernelfunc) NULL,"
|
|
func_table[23] = "/* 23 */ (kernelfunc) NULL,"
|
|
func_table[27] = "/* 27 */ (kernelfunc) NULL,"
|
|
func_table[30] = "/* 30 */ (kernelfunc) NULL,"
|
|
func_table[33] = "/* 33 */ (kernelfunc) NULL,"
|
|
func_table[37] = "/* 37 */ (kernelfunc) NULL,"
|
|
func_table[40] = "/* 40 */ (kernelfunc) NULL,"
|
|
func_table[41] = "/* 41 */ (kernelfunc) NULL,"
|
|
func_table[42] = "/* 42 */ (kernelfunc) NULL,"
|
|
func_table[49] = "/* 49 */ (kernelfunc) NULL,"
|
|
func_table[50] = "/* 50 */ (kernelfunc) NULL,"
|
|
func_table[51] = "/* 51 */ (kernelfunc) NULL,"
|
|
func_table[52] = "/* 52 */ (kernelfunc) NULL,"
|
|
func_table[53] = "/* 53 */ (kernelfunc) NULL,"
|
|
func_table[64] = "/* 64 */ (kernelfunc) NULL,"
|
|
func_table[73] = "/* 73 */ (kernelfunc) NULL,"
|
|
func_table[77] = "/* 77 */ (kernelfunc) NULL,"
|
|
func_table[81] = "/* 81 */ (kernelfunc) NULL,"
|
|
|
|
# generate function table
|
|
|
|
kernel_main_c_out("\n" +
|
|
"const kernelfunc _k_server_dispatch_table[82] =\n" +
|
|
"{\n")
|
|
for func in func_table:
|
|
kernel_main_c_out(" " + func + "\n")
|
|
kernel_main_c_out("};\n")
|
|
|
|
|
|
def kernel_main_c_driver_init():
|
|
""" Generate driver initialization routine """
|
|
|
|
kernel_main_c_out("\n" +
|
|
"void _k_init_drivers(void)\n" +
|
|
"{\n")
|
|
for driver_call in driver_list:
|
|
kernel_main_c_out(" " + driver_call + ";\n")
|
|
kernel_main_c_out("}\n")
|
|
|
|
|
|
def kernel_main_c_node_init():
|
|
""" Generate node initialization routine """
|
|
|
|
kernel_main_c_out("\n" +
|
|
"void _k_init_node(void)\n{\n")
|
|
if (len(pipe_list) > 0):
|
|
kernel_main_c_out(" _k_pipe_init();\n")
|
|
if (len(map_list) > 0):
|
|
kernel_main_c_out(" _k_mem_map_init();\n")
|
|
if (len(pool_list) > 0):
|
|
kernel_main_c_out(" _k_mem_pool_init();\n")
|
|
kernel_main_c_out("}\n")
|
|
|
|
|
|
def kernel_main_c_main():
|
|
""" Generate main() routine """
|
|
|
|
kernel_main_c_out("\n" +
|
|
"void main(void)\n" +
|
|
"{\n" +
|
|
" _k_kernel_init();\n" +
|
|
" task_group_start(EXE);\n" +
|
|
" _k_kernel_idle();\n" +
|
|
"}\n")
|
|
|
|
|
|
def kernel_main_c_generate():
|
|
""" Generate kernel_main.c file """
|
|
|
|
global kernel_main_c_data
|
|
|
|
kernel_main_c_header()
|
|
kernel_main_c_kargs()
|
|
kernel_main_c_timers()
|
|
kernel_main_c_tasks()
|
|
kernel_main_c_priorities()
|
|
kernel_main_c_events()
|
|
kernel_main_c_mutexes()
|
|
kernel_main_c_semas()
|
|
kernel_main_c_fifos()
|
|
kernel_main_c_pipes()
|
|
kernel_main_c_mailboxes()
|
|
kernel_main_c_maps()
|
|
kernel_main_c_pools()
|
|
kernel_main_c_kernel_services()
|
|
kernel_main_c_driver_init()
|
|
kernel_main_c_node_init()
|
|
kernel_main_c_main()
|
|
|
|
write_file(output_dir + 'kernel_main.c', kernel_main_c_data)
|
|
|
|
|
|
#
|
|
# GENERATE kernel_main.h FILE
|
|
#
|
|
|
|
|
|
def kernel_main_h_generate():
|
|
""" Generate kernel_main.h file """
|
|
|
|
global output_dir
|
|
|
|
subprocess.check_call([
|
|
"cp",
|
|
"-f",
|
|
os.environ["ZEPHYR_BASE"] +
|
|
"/kernel/microkernel/include/kernel_main.h",
|
|
output_dir])
|
|
|
|
|
|
#
|
|
# GENERATE micro_private_types.h FILE
|
|
#
|
|
|
|
|
|
def micro_private_types_h_generate():
|
|
""" Generate micro_private_types.h file """
|
|
|
|
global output_dir
|
|
|
|
subprocess.check_call([
|
|
"cp",
|
|
"-f",
|
|
os.environ["ZEPHYR_BASE"] +
|
|
"/kernel/microkernel/include/micro_private_types.h",
|
|
output_dir])
|
|
|
|
|
|
#
|
|
# GENERATE zephyr.h FILE
|
|
#
|
|
|
|
|
|
zephyr_h_data = ""
|
|
|
|
zephyr_h_filename_str = \
|
|
"/* zephyr.h - microkernel master header file */\n\n"
|
|
|
|
zephyr_h_include_guard = "_ZEPHYR__H_"
|
|
|
|
zephyr_h_header_include_guard_str = \
|
|
"#ifndef " + zephyr_h_include_guard + "\n" \
|
|
"#define " + zephyr_h_include_guard + "\n\n"
|
|
|
|
|
|
def generate_zephyr_h_header():
|
|
|
|
global zephyr_h_data
|
|
zephyr_h_data += \
|
|
zephyr_h_filename_str + \
|
|
copyright + \
|
|
do_not_edit_warning + \
|
|
zephyr_h_header_include_guard_str + \
|
|
"#include <microkernel.h>\n" + \
|
|
"\n"
|
|
|
|
|
|
def generate_taskgroup_line(taskgroup, group_id):
|
|
|
|
global zephyr_h_data
|
|
zephyr_h_data += \
|
|
"#define " + taskgroup + " 0x%8.8x\n" % group_id
|
|
|
|
|
|
def generate_zephyr_h_taskgroups():
|
|
|
|
global zephyr_h_data
|
|
|
|
for group in group_key_list:
|
|
generate_taskgroup_line(group, group_dictionary[group])
|
|
|
|
zephyr_h_data += "\n"
|
|
|
|
|
|
def generate_obj_id_line(name, obj_id):
|
|
|
|
return "#define " + name + " 0x0001%4.4x\n" % obj_id
|
|
|
|
|
|
def generate_obj_id_lines(obj_types):
|
|
|
|
data = ""
|
|
for obj_type in obj_types:
|
|
for obj in obj_type[0]:
|
|
data += generate_obj_id_line(str(obj[0]), obj_type[1])
|
|
obj_type[1] += 1
|
|
if obj_type[1] > 0:
|
|
data += "\n"
|
|
|
|
return data
|
|
|
|
|
|
def generate_zephyr_h_obj_ids():
|
|
|
|
global zephyr_h_data
|
|
|
|
base_event = 4 # no need to generate ids for the 4 pre-defined events
|
|
event_id = base_event
|
|
for event in event_list:
|
|
zephyr_h_data += "#define %s %u\n" % (str(event[0]), event_id)
|
|
event_id += 1
|
|
if event_id > base_event:
|
|
zephyr_h_data += "\n"
|
|
|
|
obj_types = [
|
|
[task_list, 0],
|
|
[mutex_list, 0],
|
|
[sema_list, 0],
|
|
[fifo_list, 0],
|
|
[pipe_list, 0],
|
|
[mbx_list, 0],
|
|
[map_list, 0],
|
|
[pool_list, 0],
|
|
]
|
|
zephyr_h_data += generate_obj_id_lines(obj_types)
|
|
|
|
|
|
zephyr_h_footer_include_guard_str = \
|
|
"\n#endif /* " + zephyr_h_include_guard + " */\n"
|
|
|
|
|
|
def generate_zephyr_h_footer():
|
|
|
|
global zephyr_h_data
|
|
zephyr_h_data += \
|
|
zephyr_h_footer_include_guard_str
|
|
|
|
|
|
def zephyr_h_generate():
|
|
""" Generate zephyr.h file """
|
|
|
|
generate_zephyr_h_header()
|
|
generate_zephyr_h_taskgroups()
|
|
generate_zephyr_h_obj_ids()
|
|
generate_zephyr_h_footer()
|
|
|
|
write_file(output_dir + 'zephyr.h', zephyr_h_data)
|
|
|
|
|
|
#
|
|
# SYSTEM GENERATOR MAINLINE
|
|
#
|
|
|
|
|
|
mdef_parse()
|
|
get_output_dir()
|
|
kernel_main_c_generate()
|
|
kernel_main_h_generate()
|
|
micro_private_types_h_generate()
|
|
zephyr_h_generate()
|