# -*- coding: utf-8 -*- # # TOPPERS/SSP Kernel # Toyohashi Open Platform for Embedded Real-Time Systems/ # Advanced Standard Profile Kernel # # Copyright (C) 2015 by FUJI SOFT INCORPORATED, JAPAN # Copyright (C) 2015,2016 by Embedded and Real-Time Systems Laboratory # Graduate School of Information Science, Nagoya Univ., JAPAN # Copyright (C) 2017 by Naoki Saito # Nagoya Municipal Industrial Research Institute, JAPAN # # 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ # ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改 # 変・再配布(以下,利用と呼ぶ)することを無償で許諾する. # (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 # 権表示,この利用条件および下記の無保証規定が,そのままの形でソー # スコード中に含まれていること. # (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 # 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 # 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 # の無保証規定を掲載すること. # (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 # 用できない形で再配布する場合には,次のいずれかの条件を満たすこ # と. # (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 # 作権表示,この利用条件および下記の無保証規定を掲載すること. # (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに # 報告すること. # (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 # 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. # また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理 # 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを # 免責すること. # # 本ソフトウェアは,無保証で提供されているものである.上記著作権者お # よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 # に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ # アの利用により直接的または間接的に生じたいかなる損害に関しても,そ # の責任を負わない. # # $Id: kernel.trb 670 2016-03-03 15:08:11Z ertl-hiro $ # # # コンフィギュレータのパス2の生成スクリプト # # # タイムスタンプファイルの指定 # $timeStampFileName = "kernel_cfg.timestamp" # # kernel_cfg.hの先頭部分の生成 # $kernelCfgH = GenFile.new("kernel_cfg.h") $kernelCfgH.add(< 0 # オブジェクト初期化関数の追加 $initializeFunctions.push("_kernel_initialize_#{@object}();") end end end # # 各機能モジュールのコンフィギュレーション # $initializeFunctions = [] IncludeTrb("kernel/task.trb") IncludeTrb("extension/eventflag.trb") IncludeTrb("extension/dataqueue.trb") IncludeTrb("extension/cyclic.trb") IncludeTrb("extension/alarm.trb") IncludeTrb("kernel/interrupt.trb") IncludeTrb("kernel/exception.trb") # # 非タスクコンテキスト用のスタック領域 # $kernelCfgC.comment_header("Stack Area for Non-task Context") # 非タスクコンテキスト用スタック領域のサイズ $istksz = 0 # DEF_ICSのエントリが存在するか? if $cfgData[:DEF_ICS].size == 0 # ない場合,サイズは既定値(DEFAULT_ISTKSZ)を使う $kernelCfgC.add2("#define TOPPERS_ISTKSZ DEFAULT_ISTKSZ") $istksz = $DEFAULT_ISTKSZ else # DEF_ICS のエントリがある場合 # 静的API「DEF_ICS」が複数ある(E_OBJ) if $cfgData[:DEF_ICS].size > 1 error("E_OBJ: too many DEF_ICS") end params = $cfgData[:DEF_ICS][1] # istksz に 0 を指定した場合(E_PAR) if params[:istksz] == 0 error_wrong("E_PAR", params, :istksz, "size is 0") # istk は常に NULL である (E_PAR) elsif params[:istk] != "NULL" error_wrong("E_PAR", params, :istk, "must be NULL") end $istksz = params[:istksz] $kernelCfgC.add2("#define TOPPERS_ISTKSZ\t(#{$istksz})") end # # 共有スタック領域 # SSPではすべての処理単位のスタックを共有するため, # ここでシステム全体のスタック領域を確保する. # # # 共有スタックのコンフィギュレーションに成功したかどうか # DEF_STK 処理中にエラーが発生した場合,この変数が false になる. # $defstk_success = true $kernelCfgC.comment_header("Stack Area for System") # 共有スタックのサイズ $stksz = 0 stk_str = "" stksz_str = "" # DEF_STK のエントリが存在するか? if $cfgData[:DEF_STK].size == 0 # (1) DEF_STK のエントリがない場合 stk_str = "_kernel_stack" stksz_str = AllocStack(stk_str, "TOPPERS_TSTKSZ+TOPPERS_ISTKSZ") $stksz = $tstksz + $istksz else # (2) DEF_STK のエントリがある場合 # 静的API「DEF_STK」が複数ある(E_OBJ) if $cfgData[:DEF_STK].size > 1 $defstk_success = false error("E_OBJ: too many DEF_STK") end params = $cfgData[:DEF_STK][1] # DEF_STK の stksz で 0 を指定した場合(E_PAR) if params[:stksz] == 0 $defstk_success = false error_wrong("E_PAR", params, :stksz, "not allowed") end $stksz = params[:stksz] if params[:stk] == "NULL" # stk が NULL の場合,スタック領域を自動割付け stk_str = "_kernel_stack" stksz_str = AllocStack(stk_str, "#{$stksz}") else # stk が NULL 以外の場合(アプリ側でスタック領域を用意する場合) # stksz がターゲット毎に定まるアライメントサイズの倍数にアライメントされていない場合(E_PAR) if (defined? $CHECK_STKSZ_ALIGN) && (($stksz & ($CHECK_STKSZ_ALIGN - 1)) != 0) $defstk_success = false error_wrong("E_PAR", params, :stksz, "not aligned") end stk_str = params[:stk] stksz_str = $stksz end end # # 共有スタックのスタック領域 # $kernelCfgC.add(< $stksz print("\t!!!WARNING!!!: Estimated stack size is more than the allocated stack size.") warning("Estimated stack size is more than the allocated stack size.") end print("=====================================\n") end # # タイムイベント管理 # tnum_tmevt = $cfgData[:CRE_CYC].size + $cfgData[:CRE_ALM].size $kernelCfgC.comment_header("Time Event Management") $kernelCfgC.add(< 0 # オブジェクト初期化関数の追加 $initializeFunctions.unshift("_kernel_initialize_time_event();") end # # 各モジュールの初期化関数 # $kernelCfgC.comment_header("Module Initialization Function") $kernelCfgC.append(<