Tip / ログイン to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
Translation_Bot
Community Manager
Community Manager
Community Manager

こんにちは
私は__syscallfunc() EVAL_6EDL7141_TRAP_1SH として多くの関数を実装しようとしていますが、パラメータの数とタイプが異なる関数に関して、このシステムがどれほど柔軟であるかはわかりません。

TASKINGユーザーガイドからの抜粋:

#pragma 別名 syscall_a=trap6
#pragma 別名 syscall_b=trap6
__syscallfunc(1) int型 syscall_a( int, int型 );
__syscallfunc(2) int型 syscall_b( int, int型);

int型x;
void main(ボイド)
{
x = syscall_a(1,2); // causes a trap class 6 with TIN = 1
x = syscall_b(4,3); // causes a trap class 6 with TIN = 2
}

int EVAL_6EDL7141_TRAP_1SH( 6 ) trap6( int a, int b ) // クラス 6 ハンドラEVAL_6EDL7141_TRAP_1SH
{
// switch statement on TIN
}

ここで、trap6() EVAL_2K4W_ACT_BRD_S7 、sys 呼び出しとともに発生した TIN とパラメーター自体に応じて異なるアクションを実行できるシステムコールレシーバーとしてします。 ただし、システムコールを発生させる関数は、2つの整数パラメータを取り、1つの整数を返す必要があるようです。 しかし、私がやりたいのは次のようなものです:

#pragma 別名 syscall_a = trap6
#pragma 別名 syscall_b =trap6
__syscallfunc( 1 ) int syscall_a( int );
__syscallfunc( 2 ) void syscall_b( int, void *, int );

TIN に応じて、trap6() で異なるタイプと数のパラメーターを拾うことができます。 両方の関数を syscall_x( void*, void*, void* )として使用し、trap6()内で型をキャストすることもできますが、これには毎回3つのパラメータで各関数を呼び出す必要があります - たとえば、syscall_a()は3つのパラメータを受け入れるように書き直す必要があります。

これに対する解決策はありますか?

どうもありがとう

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/AURIX/System-Calls-accepting-varying-numbers-and-types-of-parameters/td-p/674350

0 件の賞賛
1 解決策
Translation_Bot
Community Manager
Community Manager
Community Manager

こんにちは@jonnywitt 

taskingによって提供されるctc_user_guideで述べているように、入力パラメータは EVAL_6EDL7141_TRAP_1SH 識別番号(TIN)ですが、引数を含めて数値を返すこともできるため、ニーズに合わせて2つの追加の引数を置くことができますが、関数は最初に定義された引数の数に固定されます。 だから今、私が考えることができるユニークな解決策は、あなたが必要とする可能性のある引数の数を追加してそれらをキャストすることです、私はこれがポータブルでも最適解でもないことを知っていますが、ここにはそれほど多くの選択肢がないようです。

よろしく 🙂

 

#pragma alias syscall_a=trap6
#pragma alias syscall_b=trap6
__syscallfunc(1) int syscall_a( int, void *, void *);
__syscallfunc(2) int syscall_b( int, void *, void *);
void main(void){
int x;
x = syscall_a(1, ((char *)2), ((unsigned int *)5)); // causes a trap class 6 with TIN = 1
x = syscall_b(4, ((signed *)3), NULL);                // causes a trap class 6 with TIN = 2
}
static int trap_1_func(int a, void* b, void* c){
    return (a + ((char )b) + ((int)c));
}

static int trap_2_func(int a, void* b, void* c){
    return (a + ((signed )b) - ((int)c));
}

int __trap( 6 ) trap6( int a, void* b, void* c ) // trap class 6 handler
{
// switch statement on TIN
    int tin;
    tin = __get_tin(); // get the TIN
    switch( tin ){
        case 1:
            a = trap_1_func(a,(char *)b, (unsigned int *)c);
         break;
         case 2:
            a = trap_2_func(a,(signed *)b, (int *)c);
         break;
         default:
         break;
         }
    return a;
}

 

 

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/AURIX/System-Calls-accepting-varying-numbers-and-types-of-parameters/m-p/675205

元の投稿で解決策を見る

0 件の賞賛
3 返答(返信)
Translation_Bot
Community Manager
Community Manager
Community Manager

こんにちは@jonnywitt 

taskingによって提供されるctc_user_guideで述べているように、入力パラメータは EVAL_6EDL7141_TRAP_1SH 識別番号(TIN)ですが、引数を含めて数値を返すこともできるため、ニーズに合わせて2つの追加の引数を置くことができますが、関数は最初に定義された引数の数に固定されます。 だから今、私が考えることができるユニークな解決策は、あなたが必要とする可能性のある引数の数を追加してそれらをキャストすることです、私はこれがポータブルでも最適解でもないことを知っていますが、ここにはそれほど多くの選択肢がないようです。

よろしく 🙂

 

#pragma alias syscall_a=trap6
#pragma alias syscall_b=trap6
__syscallfunc(1) int syscall_a( int, void *, void *);
__syscallfunc(2) int syscall_b( int, void *, void *);
void main(void){
int x;
x = syscall_a(1, ((char *)2), ((unsigned int *)5)); // causes a trap class 6 with TIN = 1
x = syscall_b(4, ((signed *)3), NULL);                // causes a trap class 6 with TIN = 2
}
static int trap_1_func(int a, void* b, void* c){
    return (a + ((char )b) + ((int)c));
}

static int trap_2_func(int a, void* b, void* c){
    return (a + ((signed )b) - ((int)c));
}

int __trap( 6 ) trap6( int a, void* b, void* c ) // trap class 6 handler
{
// switch statement on TIN
    int tin;
    tin = __get_tin(); // get the TIN
    switch( tin ){
        case 1:
            a = trap_1_func(a,(char *)b, (unsigned int *)c);
         break;
         case 2:
            a = trap_2_func(a,(signed *)b, (int *)c);
         break;
         default:
         break;
         }
    return a;
}

 

 

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/AURIX/System-Calls-accepting-varying-numbers-and-types-of-parameters/m-p/675205

0 件の賞賛
Translation_Bot
Community Manager
Community Manager
Community Manager

そのため、少し試行錯誤した後、異なる数のパラメータでシステムコールを宣言することが可能 に思えます。 次のコードは、TASKING ツールセット v6.3r1 を使用してコンパイルされます。

 

/*****************************************************
 *
 * Demo.c
 *
 * Description : Hello World in C, ANSI-style
 *
 */

#include 
#include "apiBaseTypes.h"
#include "listAPI.h"
#include "apiMPU.h"
#include "apiComplexTypes.h"

#define TASK_CREATE_SYSCALL_ID	( 11 )
#define TASK_WAIT_SYSCALL_ID    ( 12 )


#pragma alias xTaskCreate = xSafeRTOSSyscallHandler
__syscallfunc( TASK_CREATE_SYSCALL_ID )
portBaseType xTaskCreate( const xTaskParameters * const pxTaskParameters,
						  portTaskHandleType *pxCreatedTask );

#pragma alias xTaskNotifyWait = xSafeRTOSSyscallHandler
__syscallfunc( TASK_WAIT_SYSCALL_ID )
portBaseType xTaskNotifyWait( portUnsignedBaseType uxBitsToClearOnEntry,
							  portUnsignedBaseType uxBitsToClearOnExit,
							  portUnsignedBaseType *puxNotificationValue,
							  portTickType xTicksToWait,
							  portTickType xTicksToSend );



portBaseType xTaskCreateKrnl( const xTaskParameters * const pxTaskParameters, portTaskHandleType *pxCreatedTask );
portBaseType xTaskNotifyWaitKrnl( portUnsignedBaseType uxBitsToClearOnEntry,
        portUnsignedBaseType uxBitsToClearOnExit,
        portUnsignedBaseType *puxNotificationValue,
        portTickType xTicksToWait,
		portTickType xTicksToSend );
portBaseType __trap( 6 ) xSafeRTOSSyscallHandler( void *param1, void *param2, void *param3, void *param4, void *param5 );

void main( void )
{
	portBaseType xResult;
	xTaskParameters xMyTaskParameters = { 0 };
	portTaskHandleType xMyTaskHandle = NULL;

	xResult = xTaskCreate( &xMyTaskParameters, &xMyTaskHandle );

	if( xResult == 1 )
	{
		xResult = xTaskNotifyWait( 0, 0, NULL, 5, 6 );
	}
}


portBaseType __trap( 6 ) xSafeRTOSSyscallHandler( void *param1, void *param2, void *param3, void *param4, void *param5 )
{
	portUnsignedBaseType uxTin;
	portBaseType xResult;

	uxTin = __get_tin();

	switch( uxTin )
	{
		case TASK_CREATE_SYSCALL_ID:
			xResult = xTaskCreateKrnl( ( const xTaskParameters * ) param1, ( portTaskHandleType * ) param2 );
			break;
		case TASK_WAIT_SYSCALL_ID:
			xResult = xTaskNotifyWaitKrnl( ( portUnsignedBaseType )param1,
                    				       ( portUnsignedBaseType )param2,
									       ( portUnsignedBaseType * )param3,
								    	   ( portTickType )param4,
										   ( portTickType )param5 );

	}

	return xResult;
}


portBaseType xTaskCreateKrnl( const xTaskParameters * const pxTaskParameters, portTaskHandleType *pxCreatedTask )
{
	portBaseType xReturn = 1;
	( void )pxTaskParameters;
	( void )pxCreatedTask;

	return xReturn;
}

portBaseType xTaskNotifyWaitKrnl( portUnsignedBaseType uxBitsToClearOnEntry,
        portUnsignedBaseType uxBitsToClearOnExit,
        portUnsignedBaseType *puxNotificationValue,
        portTickType xTicksToWait,
		portTickType xTicksToSend )
{
	portBaseType xReturn = xTicksToWait + xTicksToSend;
	( void )uxBitsToClearOnEntry;

	return xReturn;
}

 

 

私はまだそれを実行することができませんでしたが、私は引数がどのレジスタに配置されているかを確認するためにレジスタを調べたいと思います。

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/AURIX/System-Calls-accepting-varying-numbers-and-types-of-parameters/m-p/693728

0 件の賞賛
Translation_Bot
Community Manager
Community Manager
Community Manager

こんにちは@jonnywitt 

フォーマットツールを使用せずにコードを入れたようですので、システムはそれをスパムとしてマークします、ここにコードがあり、また、より読みやすくするために添付します、

#include  
#include "apiBaseTypes.h" 
#include "listAPI.h" 
#include "apiMPU.h" 
#include "apiComplexTypes.h" 
#define TASK_CREATE_SYSCALL_ID ( 11 ) 
#define TASK_WAIT_SYSCALL_ID ( 12 ) 
#pragma alias xTaskCreate = xSafeRTOSSyscallHandler __syscallfunc( TASK_CREATE_SYSCALL_ID ) portBaseType xTaskCreate( const xTaskParameters * const pxTaskParameters, portTaskHandleType *pxCreatedTask ); 
#pragma alias xTaskNotifyWait = xSafeRTOSSyscallHandler __syscallfunc( TASK_WAIT_SYSCALL_ID ) portBaseType xTaskNotifyWait( portUnsignedBaseType uxBitsToClearOnEntry, portUnsignedBaseType uxBitsToClearOnExit, portUnsignedBaseType *puxNotificationValue, portTickType xTicksToWait, portTickType xTicksToSend ); 
portBaseType xTaskCreateKrnl( const xTaskParameters * const pxTaskParameters, portTaskHandleType *pxCreatedTask ); 
portBaseType xTaskNotifyWaitKrnl( portUnsignedBaseType uxBitsToClearOnEntry, portUnsignedBaseType uxBitsToClearOnExit, portUnsignedBaseType *puxNotificationValue, portTickType xTicksToWait, portTickType xTicksToSend ); 
portBaseType __trap( 6 ) xSafeRTOSSyscallHandler( void *param1, void *param2, void *param3, void *param4, void *param5 ); 

void main( void ){ 
	portBaseType xResult; 
	xTaskParameters xMyTaskParameters = { 0 }; 
	portTaskHandleType xMyTaskHandle = NULL; 
	xResult = xTaskCreate( &xMyTaskParameters, &xMyTaskHandle ); 
	if( xResult == 1 ) { xResult = xTaskNotifyWait( 0, 0, NULL, 5, 6 ); } 
} 

portBaseType __trap( 6 ) xSafeRTOSSyscallHandler( void *param1, void *param2, void *param3, void *param4, void *param5 ) {
 portUnsignedBaseType uxTin; 
 portBaseType xResult; 
 uxTin = __get_tin(); 
 switch( uxTin ) { 
 	case TASK_CREATE_SYSCALL_ID: 
 	xResult = xTaskCreateKrnl( ( const xTaskParameters * ) param1, ( portTaskHandleType * ) param2 ); 
 	break; 
 	case TASK_WAIT_SYSCALL_ID: 
 	xResult = xTaskNotifyWaitKrnl( ( portUnsignedBaseType )param1, ( portUnsignedBaseType )param2, ( portUnsignedBaseType * )param3, ( portTickType )param4, ( portTickType )param5 ); 
 } return xResult; } 

 portBaseType xTaskCreateKrnl( const xTaskParameters * const pxTaskParameters, portTaskHandleType *pxCreatedTask ) { 
 	portBaseType xReturn = 1; 
 	( void )pxTaskParameters; 
 	( void )pxCreatedTask; return xReturn; 
 } 

 portBaseType xTaskNotifyWaitKrnl( portUnsignedBaseType uxBitsToClearOnEntry, portUnsignedBaseType uxBitsToClearOnExit, portUnsignedBaseType *puxNotificationValue, portTickType xTicksToWait, portTickType xTicksToSend ) {
  portBaseType xReturn = xTicksToWait + xTicksToSend; 
  ( void )uxBitsToClearOnEntry; 
  return xReturn; } 

それで、あなたがそれを作ったように見えます、今あなたは異なる入力パラメータを持つことができます、私はヘッダーファイルに含まれるいくつかの定義が必要なので、それをテストすることはできません、それでおめでとう、

よろしく!:1

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/AURIX/System-Calls-accepting-varying-numbers-and-types-of-parameters/m-p/693851

0 件の賞賛