【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.20618

ERTOSについての質問です。
投稿者---こうた(2005/04/13 10:37:03)


こんにちは。はじめまして、よろしくお願いします。Borland4.5を使ってC/eRTOSの勉強をしているものです。ある問題について質問があってここにポストさせてもらっています。
問題:I/O locationの0300hをステータスバイトとして使い、それのMSBが1ならデータが送られる。そして、ビット0からビット7は数字'0'から'127'までを持っていて、幾つかのワード単位の数字をI/O location 0302hから0304hに送ります。このプロセスを"読み込みI/O location"と"書き込みI/O location"の2つのタスク入れてマルチタスキングのCプログラムを書けという問題です。ここでI/O locationの読み書きの命令の仕方はどのように行えばいいのでしょうか?

eRTOSのサンプルコードを下に貼り付けて置きます。

/**************************************************************************/
/* test4 - shows ksendmessage, kreadmessage sync messaging */
/**************************************************************************/

#include "rtos.h"
#include <stdio.h>
#include <stdlib.h>
#include <process.h>
#include <conio.h>
#include <kconio.h>
#include <string.h>

void *peer = NULL;
void *peer2 = NULL;
bq_str *bq = NULL;

void write_string( bq_str *bq, char *s )
{
while ( *s )
bq_writebyte( bq, *s++);
}

void switcher1(DWORD arg)
{
int x;
#if defined(__TURBOC__)||defined(__BORLANDC__)
randomize();
#else
srand( time( 0 ));
#endif

kwindow( 1, 22, 80, 25);
do {
rt_yield();
x = rand();
if ( x > 25000 ) {
cprintf( " sending %u ", x );
ksendmessage( peer, x, 0 );
ksendmessage( peer, x, 0 );
ksendmessage( peer, x, 0 );
}
} while ( 1 );
}
void switcher2(DWORD arg)
{

int x;
DWORD y;
kwindow( 1, 16, 80, 20);
do {
rt_yield();
if ( kgetmessage( &x, &y ) )
cprintf(" read %u \r\n", x );
else
cprintf(".");
} while ( 1 );
}
void user_input_thread( DWORD arg )
{
char buffer[ 128 ];
kwindow( 1, 1, 80, 15);

cputs("Type quit to exit\r\n");

do {
buffer[ 0 ] = sizeof( buffer ) - 2;
kgets( buffer );
if ( !stricmp( buffer, "stop" ))
ksuspend(peer2);
else if ( !stricmp( buffer, "go" ))
kresume(peer2);

strcat( buffer, "\r\n");

/* now queue that data */
write_string( bq, buffer );
cputs("\r\n");
} while ( 1 );
}
int main(int argc, char **argv)
{
kdebug = 0;
rt_init(100);
cputs("starting...\r\n");
rt_newthread( user_input_thread, 3,4096, 0, "keyboard thread" );
peer = rt_newthread( switcher2, 2,4096, 0, "worker 2" );
peer2 = rt_newthread( switcher1, 1,4096, 0, "worker 1" );
rt_sleep( 1000000 );
}







この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧