<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>組み込みで使うOS | 即戦力モノづくり!エンジニアへの道標</title>
	<atom:link href="https://depfields.com/category/learning/embedded/os/feed/" rel="self" type="application/rss+xml" />
	<link>https://depfields.com</link>
	<description>組み込み（マイコン）スキルを楽しんで学びながら身につけて短期間で効率よく自由自在に扱えるようになりたいと思いませんか？</description>
	<lastBuildDate>Fri, 30 Jun 2023 01:43:05 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.3.1</generator>

<image>
	<url>https://depfields.com/wp-content/uploads/2020/07/cropped-favicon-1-32x32.png</url>
	<title>組み込みで使うOS | 即戦力モノづくり!エンジニアへの道標</title>
	<link>https://depfields.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>キュー【FreeRTOSでの具体的な使い方】</title>
		<link>https://depfields.com/queue/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=queue</link>
		
		<dc:creator><![CDATA[めかのとろ]]></dc:creator>
		<pubDate>Wed, 10 Jun 2020 22:21:28 +0000</pubDate>
				<category><![CDATA[組み込みで使うOS]]></category>
		<category><![CDATA[RTOS]]></category>
		<guid isPermaLink="false">https://depfields.com/?page_id=2987</guid>

					<description><![CDATA[<p>キューとは キューを使ったタスク間でのデータ転送 &#160;キューバッファ作成：&#160; キューバッファ作成　xQueueCreate関数実行例：xQueue=xQueueCreate(10,(sizeof(int [&#8230;]</p>
<p>The post <a href="https://depfields.com/queue/">キュー【FreeRTOSでの具体的な使い方】</a> first appeared on <a href="https://depfields.com">即戦力モノづくり!エンジニアへの道標</a>.</p>]]></description>
										<content:encoded><![CDATA[<div class="veu_autoEyeCatchBox"><img fetchpriority="high" width="640" height="429" src="https://depfields.com/wp-content/uploads/2020/06/duck-3217049_640.jpg" class="attachment-large size-large wp-post-image" alt="" decoding="async" srcset="https://depfields.com/wp-content/uploads/2020/06/duck-3217049_640.jpg 640w, https://depfields.com/wp-content/uploads/2020/06/duck-3217049_640-300x201.jpg 300w" sizes="(max-width: 640px) 100vw, 640px" /></div>




<h2 class="wp-block-heading">キューとは</h2>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">キュー（Queue）</span></strong>とはコンピュータ用語の一つで、FreeRTOSではデータをタスク間で転送する場合によく利用されます。語源は順番を待つものの列のことです。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">キューは</span></strong>先入れ先出し(<strong>F</strong>irst <strong>I</strong>n <strong>F</strong>irst <strong>O</strong>ut)のデータ構造となっているバッファ（一時データ格納所）です。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>これと逆の動作をする後入れ先出し（<strong>L</strong>ast <strong>I</strong>n <strong>F</strong>irst <strong>O</strong>ut）のデータ構造となっているバッファは<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">スタック</span></strong>といいます。</p>
</div></div></div>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/queue-and-stack.jpg" alt="" class="wp-image-2990" width="671" height="330" srcset="https://depfields.com/wp-content/uploads/2020/06/queue-and-stack.jpg 780w, https://depfields.com/wp-content/uploads/2020/06/queue-and-stack-300x148.jpg 300w, https://depfields.com/wp-content/uploads/2020/06/queue-and-stack-768x378.jpg 768w" sizes="(max-width: 671px) 100vw, 671px" /><figcaption>キューとスタック</figcaption></figure>



<h2 class="wp-block-heading">キューを使ったタスク間でのデータ転送</h2>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong>キューを使ったタスク間でのデータ転送の応用例</strong>として、EEPROMへのパラメータ書き込みによる保存について解説していきます。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>処理Aを行うタスクTaskAと処理Bを行うTaskBが並列実行しているアプリケーションにおいて、それぞれのタスク内に存在するデータを外部メモリEEPROMに書き込んで保存します。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">EEPROM書き込み専用タスクTaskC</span></strong>にデータの転送を行ってからキューの順番で書き込んでいきます。EEPROMの書き込み処理はマイコンの処理の中でも比較的時間を要するものです。このため、通常の処理を行うTaskAやTaskBで書き込みを行ってしまうと、肝心な処理が中断してしまいます。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>そこで、<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">EEPROMの書き込みだけを行うタスクとしてTaskC</span></strong>を作成し、<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">キューの順番にしたがって処理を行う</span>と効率がよくなります</strong>。</p>
</div></div></div>



<figure class="wp-block-image size-large"><img decoding="async" width="591" height="282" src="https://depfields.com/wp-content/uploads/2020/06/data-transfer-with-queue.jpg" alt="" class="wp-image-2989" srcset="https://depfields.com/wp-content/uploads/2020/06/data-transfer-with-queue.jpg 591w, https://depfields.com/wp-content/uploads/2020/06/data-transfer-with-queue-300x143.jpg 300w" sizes="(max-width: 591px) 100vw, 591px" /></figure>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;キューバッファ作成：&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>キューを利用するためにはまずキューの<strong>ハンドル用変数<span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">xQueue</span>を宣言</strong>しておきます。<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">ハンドル用変数とは操作で扱う変数</span></strong>と理解しておいてください。この変数でタスク間のデータ受け渡しを行います。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>次に<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">xQueueCreate関数</span></strong>でキューバッファを作成します。</p>
</div></div></div>



<figure class="wp-block-image size-large"><img decoding="async" width="646" height="353" src="https://depfields.com/wp-content/uploads/2020/06/queue-create-function.jpg" alt="" class="wp-image-2991" srcset="https://depfields.com/wp-content/uploads/2020/06/queue-create-function.jpg 646w, https://depfields.com/wp-content/uploads/2020/06/queue-create-function-300x164.jpg 300w" sizes="(max-width: 646px) 100vw, 646px" /></figure>



<p>キューバッファ作成　xQueueCreate関数実行例：xQueue=xQueueCreate(10,(sizeof(int8_t));</p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>関数の第1引数には<strong>キューに格納するデータの個数</strong>を、第2引数には<strong>キューに格納するデータ１つあたりのバイト数</strong>を指定します。<strong>この例</strong>では<strong>格納データの個数は10</strong>、受け渡すデータは<strong>最大255までの数値</strong>のため、<strong>データ長は1バイト</strong>を指定します。これでキューバッファのためのメモリが確保され、キューが使用できるようになります。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>この例では、キューバッファにはEEPROMに保存したいデータ値そのものを渡すのではなく<strong>データ値のID</strong>の受け渡しを行っています。そのため、キューの<strong>データ長さは<span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">1</span></strong>(1byte)なのですが、文字列などの受け渡しもできます。その場合は使用する<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">文字の個数</span></strong>（1文字1byte）を指定します。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>ただし、キューを作成することはメモリを確保することなのでメモリが不十分で確保に失敗すると<strong>xQueueCreate関数</strong>の返り値<strong>ハンドル用変数xQueue</strong>は<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">NULL</span></strong>となります。キューを作成する場合は上例のように<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">キュー作成の確保を確認</span></strong>してから次に進めます。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;キューへの送信：&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>キューへデータを渡す（キューへの送信）には処理を行う各タスク内で行います。</p>
</div></div></div>



<figure class="wp-block-image size-large"><img decoding="async" width="569" height="294" src="https://depfields.com/wp-content/uploads/2020/06/queue-tx.jpg" alt="" class="wp-image-2992" srcset="https://depfields.com/wp-content/uploads/2020/06/queue-tx.jpg 569w, https://depfields.com/wp-content/uploads/2020/06/queue-tx-300x155.jpg 300w" sizes="(max-width: 569px) 100vw, 569px" /></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>キューへのデータ送信は<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">xQueueSendToBack関数</span></strong>を使用します。関数の第1引数は<strong>キューハンドル用変数</strong>xQueueを、第2引数には<strong>送信するデータのポインタ（アドレス）</strong>を指定します。関数の第3引数はキューの最大の待ち時間を指定します。指定時間の単位はTickです。<strong>マクロのportMAX_DELAYを指定すると待ち時間は<span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">制限なし</span></strong>になります。逆に<strong>0を指定すると待ち時間は<span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">なし</span></strong>になります。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;"> キューへの受信： </span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>キューへ格納したデータを受け取るのは（キューからの受信）のはタスク内で行います。データを処理したいタスク内で行います。この例ではEEPROMの書き込み専用タスクTaskCで行います。</p>
</div></div></div>



<figure class="wp-block-image size-large"><img decoding="async" width="534" height="321" src="https://depfields.com/wp-content/uploads/2020/06/queue-rx.jpg" alt="" class="wp-image-2994" srcset="https://depfields.com/wp-content/uploads/2020/06/queue-rx.jpg 534w, https://depfields.com/wp-content/uploads/2020/06/queue-rx-300x180.jpg 300w" sizes="(max-width: 534px) 100vw, 534px" /></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>キューからデータ受信は<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">xQueueReceive関数</span></strong>を使用します。キューからのデータを格納する変数を準備しておきます。この例では1バイトのqueue_bufferとしています。関数の第1引数は<strong>キューハンドル用変数</strong>xQueueを、第2引数には<strong>データ格納変数queue_bufferのポインタ（アドレス）</strong>を指定します。関数の第3引数はキューの最大の待ち時間を指定します。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>送信のときとデータの流れは逆になり、キューからキューハンドル変数xQueueを介してデータを受け取り、データ格納変数queue_bufferで受け取ってそのデータ値にしたがって順次処理していく要領です。</p>
</div></div></div>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/queue-data-flow.jpg" alt="" class="wp-image-2996" width="685" height="587" srcset="https://depfields.com/wp-content/uploads/2020/06/queue-data-flow.jpg 685w, https://depfields.com/wp-content/uploads/2020/06/queue-data-flow-300x257.jpg 300w" sizes="(max-width: 685px) 100vw, 685px" /><figcaption>キューによるデータの流れ</figcaption></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>このため、TaskCの実行周期がまわってきたときにキューバッファが空になるまでEEPROMの書き込みを実行することになります。これで<strong>TaskAとTaskBは自分の処理だけに集中できる</strong>ことになります。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>サンプル例では通常の処理TaskAやTaskBで発生したデータをとりあえずキューバッファにためておいて、比較的実行周期は長めで優先順位は高く設定したEEPROM書き込み専用タスクTaskCに渡しています（優先順位に関しては処理によります）。</p>
</div></div></div>


<div class="linkcard"><div class="lkc-external-wrap"><a class="lkc-link no_icon" href="https://en.depfields.com/queue/" target="_blank" rel="external noopener"><div class="lkc-card"><div class="lkc-info"><img class="lkc-favicon" src="https://www.google.com/s2/favicons?domain=en.depfields.com" alt="" width=16 height=16 /><div class="lkc-domain">Most Powerful Bible to Become an Embedded Engineer</div></div><div class="lkc-content"><figure class="lkc-thumbnail"><img class="lkc-thumbnail-img" src="//depfields.com/wp-content/uploads/pz-linkcard/cache/9e1a3440c5879622fac5c9d8e8e69ed06bb1cbaae69738973e88c75b5bee3b4c.jpeg" alt="" /></figure><div class="lkc-title"><div class="lkc-title-text">Queue[Specific usage in FreeRTOS] | Most Powerful Bible to Become an Embedded...</div></div><div class="lkc-url">https://en.depfields.com/queue/</div><div class="lkc-excerpt">What is a cue?Queue is a computer term, often used in FreeRTOS to transfer data between tasks. The etymology of the word is a sequence of items waiting for their turn.A queue is a buffer (temporary data storage) with a First</div></div><div class="clear"></div></div></a></div></div><p>The post <a href="https://depfields.com/queue/">キュー【FreeRTOSでの具体的な使い方】</a> first appeared on <a href="https://depfields.com">即戦力モノづくり!エンジニアへの道標</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>FreeRTOSタスク管理の基本【学習・実践向け：具体的な使い方】</title>
		<link>https://depfields.com/task/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=task</link>
		
		<dc:creator><![CDATA[めかのとろ]]></dc:creator>
		<pubDate>Wed, 10 Jun 2020 08:02:44 +0000</pubDate>
				<category><![CDATA[組み込みで使うOS]]></category>
		<category><![CDATA[RTOS]]></category>
		<guid isPermaLink="false">https://depfields.com/?page_id=2958</guid>

					<description><![CDATA[<p>FreeRTOSを使ったタスク管理の基本を構成の概念を説明しながら実際のプログラム内の具体的な記述を挙げて解説していますので実践のプログラムにすぐに活用できます。学習向けとしていますが、もちろん実践で使えるものです。 タ [&#8230;]</p>
<p>The post <a href="https://depfields.com/task/">FreeRTOSタスク管理の基本【学習・実践向け：具体的な使い方】</a> first appeared on <a href="https://depfields.com">即戦力モノづくり!エンジニアへの道標</a>.</p>]]></description>
										<content:encoded><![CDATA[<div class="veu_autoEyeCatchBox"><img width="640" height="393" src="https://depfields.com/wp-content/uploads/2020/06/1826416_s.jpg" class="attachment-large size-large wp-post-image" alt="" decoding="async" srcset="https://depfields.com/wp-content/uploads/2020/06/1826416_s.jpg 640w, https://depfields.com/wp-content/uploads/2020/06/1826416_s-300x184.jpg 300w" sizes="(max-width: 640px) 100vw, 640px" /></div>
<p class="vk_block-margin-sm--margin-top vk_block-margin-sm--margin-bottom">FreeRTOSを使ったタスク管理の基本を構成の概念を説明しながら実際のプログラム内の具体的な記述を挙げて解説していますので実践のプログラムにすぐに活用できます。学習向けとしていますが、もちろん実践で使えるものです。</p>







<h2 class="wp-block-heading">タスクの優先度と使用頻度</h2>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>アプリケーションプログラムで2種類の処理Aと処理BをRTOSでタスク管理する方法について解説します。処理AはTaskA、処理BはTaskBとして優先順位のあるなし、タスク実行頻度の指定あるなしでどのように実行されるかを見ていきましょう。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;2つのタスクTaskAとTaskBの優先順位が同じで、タスク実行頻度になにも指定しない場合:&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>FreeRTOSの基本設定では<strong>1秒間にTick数を1000で指定しているのでタイムスライス（Tick）は1ms</strong>です。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>つまり、タイムスライス1ms毎にTaskAとTaskBは交互に<strong>実行中状態</strong>と<strong>レディー状態</strong>がRTOSカーネルにより切り替えられます。タイムスライス1msの間に処理Aおよび処理Bの内容をそれぞれ繰り返します。例えば、図のように処理Aを一回実行するのに要する時間が0.2msであれば5回処理を繰り返したところで処理Bに切り替わります。</p>
</div></div></div>



<figure class="wp-block-image size-large"><img decoding="async" width="532" height="269" src="https://depfields.com/wp-content/uploads/2020/06/type1_timechart.jpg" alt="" class="wp-image-2960" srcset="https://depfields.com/wp-content/uploads/2020/06/type1_timechart.jpg 532w, https://depfields.com/wp-content/uploads/2020/06/type1_timechart-300x152.jpg 300w" sizes="(max-width: 532px) 100vw, 532px" /></figure>



<figure class="wp-block-image size-large"><img decoding="async" width="620" height="291" src="https://depfields.com/wp-content/uploads/2020/06/type1.jpg" alt="" class="wp-image-2961" srcset="https://depfields.com/wp-content/uploads/2020/06/type1.jpg 620w, https://depfields.com/wp-content/uploads/2020/06/type1-300x141.jpg 300w" sizes="(max-width: 620px) 100vw, 620px" /></figure>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;TaskAの優先順位がTaskBのよりも高く、TaskAを5ms中断させる場合： </span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>優先順位はxTaskCreate関数の第5引数の数値を1から5まで指定します。（設定ヘッダファイルFreeRTOSConfig.hのconfigMAX_PRIORITIESを<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">6</span></strong>にした場合）<br><strong>FreeRTOS</strong>では<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">数値が大きい方</span>が優先順位は高くなります</strong>。ここではTaskAに優先度2、TaskBに優先度1を指定していますのでTaskAの優先度が高くなります。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>TaskAの実行を一定時間中断させるためには<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">vTaskDelay関数</span></strong>を使用します。関数の引数には待ち時間を指定します。Tickが1msなので引数を5に指定して処理Aを一度実行すると<strong>TaskAは</strong>5ms間<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">ブロック状態(blocked)</span></strong>となり<strong>中断</strong>します。この後コンテキストスイッチにより<strong>TaskBに切り替わり<span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">実行中（Running）</span></strong>となります。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>待ち時間5msが経過するとTaskAは最優先度ですので再び実行します。つまり、<strong>約5msの周期で処理Aが一度だけ</strong>行われます。</p>
</div></div></div>



<figure class="wp-block-image size-large"><img decoding="async" width="540" height="347" src="https://depfields.com/wp-content/uploads/2020/06/type2_timechart.jpg" alt="" class="wp-image-2962" srcset="https://depfields.com/wp-content/uploads/2020/06/type2_timechart.jpg 540w, https://depfields.com/wp-content/uploads/2020/06/type2_timechart-300x193.jpg 300w" sizes="(max-width: 540px) 100vw, 540px" /></figure>



<figure class="wp-block-image size-large"><img decoding="async" width="633" height="329" src="https://depfields.com/wp-content/uploads/2020/06/type2.jpg" alt="" class="wp-image-2963" srcset="https://depfields.com/wp-content/uploads/2020/06/type2.jpg 633w, https://depfields.com/wp-content/uploads/2020/06/type2-300x156.jpg 300w" sizes="(max-width: 633px) 100vw, 633px" /></figure>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;TaskAの優先順位がTaskBのよりも高く、TaskAを10ms、TaskBを2ms中断させる場合： </span></p>



<figure class="wp-block-image size-large"><img decoding="async" width="543" height="277" src="https://depfields.com/wp-content/uploads/2020/06/type3_timechart.jpg" alt="" class="wp-image-2964" srcset="https://depfields.com/wp-content/uploads/2020/06/type3_timechart.jpg 543w, https://depfields.com/wp-content/uploads/2020/06/type3_timechart-300x153.jpg 300w" sizes="(max-width: 543px) 100vw, 543px" /></figure>



<figure class="wp-block-image size-large"><img decoding="async" width="630" height="330" src="https://depfields.com/wp-content/uploads/2020/06/type3.jpg" alt="" class="wp-image-2965" srcset="https://depfields.com/wp-content/uploads/2020/06/type3.jpg 630w, https://depfields.com/wp-content/uploads/2020/06/type3-300x157.jpg 300w" sizes="(max-width: 630px) 100vw, 630px" /></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>次の例は、動作はtype3と同じなのですが、タスクにパラメータを渡しています。<br>xTaskCreate関数の第4引数に渡したい値を格納したポインタを指定しますとタスクにパラメータ（値）を渡すことができます。TaskAとTaskBのそれぞれの待ち時間を渡す例です。</p>
</div></div></div>



<figure class="wp-block-image size-large"><img decoding="async" width="677" height="495" src="https://depfields.com/wp-content/uploads/2020/06/type5.jpg" alt="" class="wp-image-2966" srcset="https://depfields.com/wp-content/uploads/2020/06/type5.jpg 677w, https://depfields.com/wp-content/uploads/2020/06/type5-300x219.jpg 300w" sizes="(max-width: 677px) 100vw, 677px" /></figure>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;タスク実行周期を正確に設定したい場合： </span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>これまでの例ではvTaskDelay関数でタスクに待ち時間を入れていました。タスク内の処理に要する時間はまちまちのため、実行周期は多少前後します。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>実行周期を正確に設定したい場合は<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">vTaskDelayUntil関数</span></strong>を使用します。サンプル図のような構成で、<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">xTaskGetTickCount関数</span></strong>で前回のタスク起動時間を取得して<strong>vTaskDelayUntil関数</strong>に渡しています。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-right vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>筆者の体験ではモータの動作を伴うタスクの実行周期を正確に設定すべくこのvTaskDelayUntil関数を使用したところ、タスクを切り替えの過渡期にモータの動作が不安定になることがありました。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-right vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>よくよく調べてみると、切り替えの直後はxTaskGetTickCount関数で取得したxLastWakeTimeの値が不定であったため、切り替え直後だけ動作が不安定になっていたようです。モータのモーションコントロールに演算をしており、タスク切り替えのつなぎの部分で演算値が不安定となったからでした。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-right vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>問題の解決方法は他にあるかもしれませんが、このようなシビアな状況では問題がなければ<strong>vTaskDelayUntil関数は使用せず</strong>、<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">vTaskDelay関数を使う</span></strong>ことで問題は解決しました。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>いままでは待ち時間で時間を指定するのに引数の<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">単位はTick</span></strong>でした。指定単位をmsにするためにはFreeRTOSの<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">定数portTICK_RATE_MSを図のように使用</span></strong>すれば<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">指定値の単位をms</span></strong>とすることができます。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>Tickがちょうど1msであれば定数portTICK_RATE_MSを使用しなくても指定値の単位はmsとなりますが、そうでない場合に使用すると便利です。</p>
</div></div></div>



<figure class="wp-block-image size-large"><img decoding="async" width="561" height="177" src="https://depfields.com/wp-content/uploads/2020/06/type4_timechart.jpg" alt="" class="wp-image-2968" srcset="https://depfields.com/wp-content/uploads/2020/06/type4_timechart.jpg 561w, https://depfields.com/wp-content/uploads/2020/06/type4_timechart-300x95.jpg 300w" sizes="(max-width: 561px) 100vw, 561px" /></figure>



<figure class="wp-block-image size-large"><img decoding="async" width="628" height="410" src="https://depfields.com/wp-content/uploads/2020/06/type4.jpg" alt="" class="wp-image-2967" srcset="https://depfields.com/wp-content/uploads/2020/06/type4.jpg 628w, https://depfields.com/wp-content/uploads/2020/06/type4-300x196.jpg 300w" sizes="(max-width: 628px) 100vw, 628px" /></figure>



<h2 class="wp-block-heading">タスク切り替え</h2>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>FreeRTOSでは任意に複数のタスクのうち、<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">特定のタスクを有効にしたり、無効にしたりすることができます</span></strong>。<br>xTaskCreate関数で登録したタスクはプログラムが開始するとRTOSカーネルの管理のもとに<strong>順次実行</strong>されます。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>実際のアプリケーションでは複数の機能としてタスクを登録するのですが、登録したすべてが常に必要でなく、<strong>必要に応じて有効</strong>にしたり、<strong>他のタスクと入れ替え</strong>たりしながら使用する用途も多いです。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>このようなタスクの切り替えに使用するものが<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">vTaskResume関数</span></strong>と<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">vTaskSupend関数</span></strong>です。</p>
</div></div></div>



<p>タスク切り替え xTaskResume関数、xTaskSuspend関数実行例：<br>　xTaskSuspend(TaskA);<br>　xTaskResume(TaskB);</p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>関数の引数は<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">xTaskCreat関数の第6引数</span></strong>で指定した<strong>タスクハンドラを指定</strong>します。タスクが有効な場合にvTaskSuspend関数を実行すると<strong>どの状態からもサスペンド状態(Supened)に移行</strong>し、休止状態となります。vTaskResume関数を実行するとまず<strong>レディー状態(Ready)へ移行</strong>して、優先順位などの条件次第で実行中(Running)となります。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>タスク切り替えのプログラム例を挙げてみます。<br>TaskCはタスク切り替え用管理タスクとして、switch関数で変数”mode”が0か1でTaskA、TaskBを切り替えています。</p>
</div></div></div>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/task_switch.jpg" alt="" class="wp-image-3711" width="569" height="605" srcset="https://depfields.com/wp-content/uploads/2020/06/task_switch.jpg 695w, https://depfields.com/wp-content/uploads/2020/06/task_switch-282x300.jpg 282w" sizes="(max-width: 569px) 100vw, 569px" /><figcaption class="wp-element-caption">タスク管理</figcaption></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>これまでRTOSを使用してタスク管理を解説してきましたが、RTOSを使用しなければ結構手間のかかる処理が、RTOSではいとも簡単に実現できてしまいます。ここではRTOSの基本的なタスク管理に限っていますがこれでも<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">大抵のアプリケーションは実現できてしまいます</span></strong>。慣れるに従って更に踏み込んで発展させて、より効率のよいシステムを構築してみてください。</p>
</div></div></div>



<figure class="wp-block-image size-large"><img decoding="async" width="535" height="249" src="https://depfields.com/wp-content/uploads/2020/06/task-switch-flow.jpg" alt="" class="wp-image-2969" srcset="https://depfields.com/wp-content/uploads/2020/06/task-switch-flow.jpg 535w, https://depfields.com/wp-content/uploads/2020/06/task-switch-flow-300x140.jpg 300w" sizes="(max-width: 535px) 100vw, 535px" /></figure>



<div class="linkcard"><div class="lkc-external-wrap"><a class="lkc-link no_icon" href="https://en.depfields.com/task/" target="_blank" rel="external noopener"><div class="lkc-card"><div class="lkc-info"><img class="lkc-favicon" src="https://www.google.com/s2/favicons?domain=en.depfields.com" alt="" width=16 height=16 /><div class="lkc-domain">Most Powerful Bible to Become an Embedded Engineer</div></div><div class="lkc-content"><figure class="lkc-thumbnail"><img class="lkc-thumbnail-img" src="//depfields.com/wp-content/uploads/pz-linkcard/cache/4fcfea42a3ea29032738082f4ccc3846b1501966c77449ca96b1713ef484c611.jpeg" alt="" /></figure><div class="lkc-title"><div class="lkc-title-text">FreeRTOS task management basics [For Learning and Practice] | Most Powerful B...</div></div><div class="lkc-url">https://en.depfields.com/task/</div><div class="lkc-excerpt">The basics of task management using FreeRTOS are explained with concrete descriptions in actual programs while explaining the concepts of configuration, so you can immediately apply them to your practical programs. Although it is intended</div></div><div class="clear"></div></div></a></div></div><p>The post <a href="https://depfields.com/task/">FreeRTOSタスク管理の基本【学習・実践向け：具体的な使い方】</a> first appeared on <a href="https://depfields.com">即戦力モノづくり!エンジニアへの道標</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>FreeRTOS【STM32学習向け】</title>
		<link>https://depfields.com/freertos/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=freertos</link>
		
		<dc:creator><![CDATA[めかのとろ]]></dc:creator>
		<pubDate>Wed, 10 Jun 2020 05:15:41 +0000</pubDate>
				<category><![CDATA[組み込みで使うOS]]></category>
		<category><![CDATA[RTOS]]></category>
		<guid isPermaLink="false">https://depfields.com/?page_id=2919</guid>

					<description><![CDATA[<p>マイコン向けにさまざまなRTOSがありますが当サイトではSTM32マイコンの学習用にFreeRTOSを使用します。最新のAMAZON系のものではなく従来タイプを使用しています。学習用ですのでできるだけシンプルなものから始 [&#8230;]</p>
<p>The post <a href="https://depfields.com/freertos/">FreeRTOS【STM32学習向け】</a> first appeared on <a href="https://depfields.com">即戦力モノづくり!エンジニアへの道標</a>.</p>]]></description>
										<content:encoded><![CDATA[<div class="veu_autoEyeCatchBox"><img width="433" height="300" src="https://depfields.com/wp-content/uploads/2020/06/rtos_logo-1.jpg" class="attachment-large size-large wp-post-image" alt="" decoding="async" srcset="https://depfields.com/wp-content/uploads/2020/06/rtos_logo-1.jpg 433w, https://depfields.com/wp-content/uploads/2020/06/rtos_logo-1-300x208.jpg 300w" sizes="(max-width: 433px) 100vw, 433px" /></div>
<p class="vk_block-margin-sm--margin-top vk_block-margin-sm--margin-bottom">マイコン向けにさまざまなRTOSがありますが当サイトではSTM32マイコンの学習用にFreeRTOSを使用します。最新のAMAZON系のものではなく従来タイプを使用しています。学習用ですのでできるだけシンプルなものから始めるのがよいと考えます。</p>







<h2 class="wp-block-heading">FreeRTOSとは</h2>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/rtos_logo.jpg" alt="" class="wp-image-2922" width="267" height="116"/><figcaption class="wp-element-caption">FreeRTOSロゴ</figcaption></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>FreeRTOSは<strong>オープンソースとして提供</strong>されており、無償で商用アプリケーションに使用することができるマイクロコントローラーおよび小型マイクロプロセッサ向けのリアルタイムオペレーティングシステム (RTOS) です。現状ではAmazon社が維持管理しています。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>FreeRTOSはフリーで使用できるのですが、RTOSとして要求される基本機能はそろっており、必要最低限に絞って使用し、コードサイズを小さくすることもできます。&nbsp;</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>当サイトではFreeRTOS機能のうち<strong>タスクの管理</strong>（優先度設定、実行頻度設定、タスク切換え）、<strong>キュー</strong>（待ち行列）を使ったアプリケーションを解説したいとおもいます。（タスク間通信のバイナリセマフォ、カウンティングセマフォ、ミューテックスについてはとりあげていません）</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;FreeRTOSを使うための準備、設定（マイコンに対するもの、初めだけ）</span></p>



<div class="wp-block-media-text is-stacked-on-mobile is-vertically-aligned-top" style="grid-template-columns:41% auto"><figure class="wp-block-media-text__media"><img decoding="async" width="367" height="489" src="https://depfields.com/wp-content/uploads/2020/06/freertos_folder1-3.jpg" alt="" class="wp-image-2954 size-full" srcset="https://depfields.com/wp-content/uploads/2020/06/freertos_folder1-3.jpg 367w, https://depfields.com/wp-content/uploads/2020/06/freertos_folder1-3-225x300.jpg 225w" sizes="(max-width: 367px) 100vw, 367px" /></figure><div class="wp-block-media-text__content">
<p class="has-normal-font-size">FreeRTOSに必要な要素は「<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">Source</span></strong>」フォルダ以下にすべて含まれています。「<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">Source</span></strong>」フォルダをプロジェクト内にコピーし、アプリケーションのプロジェクトの設定で<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">このフォルダおよびこれに属するサブフォルダすべてのパスを通しておきます。</span></strong></p>


</div></div>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/freertos_folder2-2.jpg" alt="" class="wp-image-2929" width="736" height="304" srcset="https://depfields.com/wp-content/uploads/2020/06/freertos_folder2-2.jpg 736w, https://depfields.com/wp-content/uploads/2020/06/freertos_folder2-2-300x124.jpg 300w" sizes="(max-width: 736px) 100vw, 736px" /><figcaption class="wp-element-caption">FreeRTOSを構成するファイル（アプリのプロジェクト内）</figcaption></figure>



<p><span style="background-color: #003300; color: #ffffff;">　FreeRTOSにおける最近の事情：　</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>STM32マイコンの最新開発環境であるSTM32CubeIDEでは自動生成ツールSTM32CubeMXの流れでFreeRTOSも手順に従うと自動的に組み込むことができます。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>ところが、自動生成されたコードはペリフェラルドライバがHALになり抽象化されたようにRTOSコードも抽象化されたCMSIS（ARM　Cortex規格）のAPI（Application Programming Interface）がベースのものになっており従来のFreeRTOSとは似ても似つかないものになっています。</p>
</div></div></div>



<div style="display: inline-block; background: #191970; padding: 5px 10px; color: #ffffff; border-radius: 5px 5px 0px 0px;"><strong>ポイント</strong></div>
<div style="background: #ffffea; border-radius: 0px 10px 10px 10px; padding: 10px; border: 3px solid #191970;">
<p>RTOSに慣れないうちはこの新しいものをあえて使う必要はなく、情報も豊富な<strong><span class="vk_highlighter" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" data-color="#fffd6b">従来通りのFreeRTOSで理解を深める</span></strong>ことがいいように思われます。</p>
</div>



<div class="wp-block-vk-blocks-spacer vk_spacer vk_spacer-type-margin-top"><div class="vk_block-margin-md--margin-top"></div></div>



<h2 class="wp-block-heading">FreeRTOSを使ったタスク管理の仕組み</h2>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>早速FreeRTOSを採用したプログラムの構成について見ていきましょう。</p>
</div></div></div>



<figure class="wp-block-image size-large"><img decoding="async" width="651" height="484" src="https://depfields.com/wp-content/uploads/2020/06/multi-task.jpg" alt="" class="wp-image-2943" srcset="https://depfields.com/wp-content/uploads/2020/06/multi-task.jpg 651w, https://depfields.com/wp-content/uploads/2020/06/multi-task-300x223.jpg 300w" sizes="(max-width: 651px) 100vw, 651px" /></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>タスク管理を行う<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">RTOSの中核部分</span></strong>を<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">カーネル</span></strong>といいます。<br>アプリケーションプログラムにおいて処理Aと処理Bをそれぞれの<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">タスクに登録</span></strong>して<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">カーネルを起動</span></strong>（タスクスケジューラスタート）して<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">並列処理（マルチタスク）させる例</span></strong>です。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>FreeRTOSを使用する場合はまず<strong>使用するタスクを登録</strong>します。<strong>処理A</strong>と<strong>処理B</strong>は<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">タスク関数（TaskAとTaskB）として登録</span></strong>し、それぞれの関数のなかにある無限ループwhile(1)内に記述します。この例では<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">処理AをTaskA関数</span></strong>内に、<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">処理BをTaskB関数</span></strong>内に記述します。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>それぞれの処理は無限ループ内にありますが、<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">RTOSカーネルがCPUの状態を退避させたり復元したりしてタスクを切り替えます</span></strong>。この切替処理を<span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter"><strong>コンテキストスイッチ</strong></span>といいます。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>タスクを登録するためには<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">xTaskCreate関数</span></strong>を使用します。</p>
</div></div></div>



<p>タスク登録 xTaskCreate関数実行例：<br>xTaskCreate(TaskA, (signed portCHAR *)”TaskA”, 192, NULL,1,NULL);</p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>関数の第1引数は<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">タスク関数名</span></strong>、第2引数はデバッグ用タスク名とありますが例のように<strong>タスク名</strong>でいいと思います。第3引数は<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">タスクのデータを格納するスタックの大きさ</span></strong>、第4引数は<strong>タスクに渡すパラメータへのポインタ</strong>、第5引数は<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">優先順位</span></strong>、そして第6引数は<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">タスク管理に使用するハンドラ</span></strong>です。<br>引数の定義として説明するのに言葉で表すとわかりにくいので例をあげて説明します。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>これら引数について具体例で後に説明しますが基本設定ヘッダファイル<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">FreeRTOSConfig.h</span></strong>で設定するパラメータと関連するものもあります。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>第3引数は<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">タスクで使用するデータを保管するスタック容量</span></strong>でオーバーフローが起きない程度は確保しておく必要があります。<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">ワード単位で指定</span></strong>し、最小奨励スタック領域は128ワード（512バイト）で標準的に<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">192</span></strong>ワード（768バイト）としておけば大抵は安定しています。ただ、スタック容量は大きい方が安定して安心なのですが、タスク数が増える場合は<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">マイコンのRAM容量</span>を超えないよう</strong>にしなければいけません。実際にプログラムを動かしながら加減するようにします。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>第4,5,6引数は後に実例で解説します。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>タスクを登録したあとはvTaskStartScheduler関数を実行するとRTOSのカーネルが起動（スケジューラ起動）します。</p>
</div></div></div>



<p>タスク登録　vTaskStartScheduler関数実行例： <strong>xTaskStartScheduler();</strong></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>main関数の最後には無限ループwhile(1)を挿入しておきます。必要あればこの無限ループ内にエラー処理などを記述しておきます。カーネルが起動し、タスクが実行されると、あらかじめ設定した切り替える期間（<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">タイムスライス</span></strong>）で自動的にタスクは切り替わり（<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">コンテキストスイッチ</span></strong>）交互に実行されます。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>FreeRTOSタスク管理の基本的な構成は図に示したものをこれまで解説してきたとおりです。実際のアプリケーションにおいて<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">タスク優先順位</span></strong>、<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">タスク実行頻度</span></strong>を設定したり、<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">タスクの有効、無効を切り替え</span></strong>たりできるようになれば、より複雑で多機能なシステムを容易で柔軟に実現できるようになります。</p>
</div></div></div>



<p><span style="background-color: #003300; color: #ffffff;">&nbsp;FreeRTOSを使うための初期設定：FreeRTOSConfig.h&nbsp;</span></p>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">初期設定はヘッダファイルFreeRTOSConfig.h</span></strong>でパラメータの指定を行います。使用する機能の有無も指定できますので必要な機能だけに絞った設定でサイズを小さくすることができます。この設定ファイルは「<strong>Source</strong>」フォルダ直下に置いておきます。この中で特に重要なパラメータについて解説していきます。</p>
</div></div></div>



<figure class="wp-block-image size-full"><img decoding="async" width="780" height="744" src="https://depfields.com/wp-content/uploads/2020/06/FreeRTOSConfig.png" alt="" class="wp-image-13713" srcset="https://depfields.com/wp-content/uploads/2020/06/FreeRTOSConfig.png 780w, https://depfields.com/wp-content/uploads/2020/06/FreeRTOSConfig-300x286.png 300w, https://depfields.com/wp-content/uploads/2020/06/FreeRTOSConfig-768x733.png 768w" sizes="(max-width: 780px) 100vw, 780px" /><figcaption class="wp-element-caption">FreeRTOSConfig.h</figcaption></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>このファイルの冒頭部分で<strong>割り込みハンドラの名称の変更定義を追加</strong>していますがこれはFreeRTOSで使用するハンドラ名称とARM Cortex-M3で使用するハンドラ名称が異なるからです。<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">STM32で使われる標準名称に修正</span></strong>しています。</p>
</div></div></div>



<figure class="wp-block-image size-large"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/freertos-parameter.jpg" alt="" class="wp-image-2937"/></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>教材ボードではクロックは72MHzですので<span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter"><strong>configCPU_CLOCK_HZ</strong>は<strong>72000000</strong></span>を指定しています。<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">タイムスライス単位を1ms</span></strong>とするため<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">configTICK_RATE_HZ</span></strong>は<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">1秒間のTick数を1000（Tick:1ms）</span></strong>に指定しています。これでタスクを切り替える<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">コンテキストスイッチが1msごとに発生</span></strong>します。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>タスク優先度は5段階としたいために<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">configMAX_PRIORITIES</span></strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">は</span><strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">5</span></strong>に指定しています。優先度は0(IDLEタスク）から機能しますので、この場合、設定優先度は1から4までとなります。必要以上に大きな値を指定するとそれだけメモリを消費します。configMINIMAL_STACK_SIZEには<strong>128</strong>を指定しておきます。<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">RTOSに割り当てるRAM合計サイズ</span></strong>として確保する値を<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">configTOTAL_HEAP_SIZEに指定</span></strong>します。登録するタスクの数と各タスクに割り当てる容量を考慮して値を指定します。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>最後のconfigMAX_TASK_NAME_LEN(タスク名最大長）は16(半角16文字)を指定しておきます。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>教材ボードでは<strong>RAMが64k</strong>で十分なためRTOSに割り当てるメモリ容量は少し贅沢な設定としていますが、RAMが小さい場合はシビアに調整する必要があります。RTOSを使用するアプリケーションでは<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">RAM容量の大部分はRTOSの割当</span></strong>になりますので<strong>マイコンの仕様に合わせて意識して設定する</strong>ようにしてください。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>これでFreeRTOSの初期設定は完了ですので、あとはアプリケーションに合わせて、どのようなタスクの管理ができるかを解説していきます。</p>
</div></div></div>


<div class="linkcard"><div class="lkc-external-wrap"><a class="lkc-link no_icon" href="https://en.depfields.com/freertos/" target="_blank" rel="external noopener"><div class="lkc-card"><div class="lkc-info"><img class="lkc-favicon" src="https://www.google.com/s2/favicons?domain=en.depfields.com" alt="" width=16 height=16 /><div class="lkc-domain">Most Powerful Bible to Become an Embedded Engineer</div></div><div class="lkc-content"><figure class="lkc-thumbnail"><img class="lkc-thumbnail-img" src="//depfields.com/wp-content/uploads/pz-linkcard/cache/4d27158ba528a8ade526a97c777ddaf0df4e7f55b8f070cee35e94415d59d764.jpeg" alt="" /></figure><div class="lkc-title"><div class="lkc-title-text">FreeRtos[for STM32 learning] | Most Powerful Bible to Become an Embedded Engi...</div></div><div class="lkc-url">https://en.depfields.com/freertos/</div><div class="lkc-excerpt">There are various RTOS for microcontrollers, but this site uses FreeRTOS for learning STM32 microcontrollers. We use the conventional type for learning STM32 microcontrollers, not the latest AMAZON type. Since it is for learning, we think</div></div><div class="clear"></div></div></a></div></div><p>The post <a href="https://depfields.com/freertos/">FreeRTOS【STM32学習向け】</a> first appeared on <a href="https://depfields.com">即戦力モノづくり!エンジニアへの道標</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>リアルタイムOS【マイコン開発には必須】</title>
		<link>https://depfields.com/rtos/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=rtos</link>
		
		<dc:creator><![CDATA[めかのとろ]]></dc:creator>
		<pubDate>Wed, 10 Jun 2020 04:29:34 +0000</pubDate>
				<category><![CDATA[組み込みで使うOS]]></category>
		<category><![CDATA[RTOS]]></category>
		<guid isPermaLink="false">https://depfields.com/?page_id=2909</guid>

					<description><![CDATA[<p>リアルタイムOSとは 組み込みでリアルタイムOSを使う理由</p>
<p>The post <a href="https://depfields.com/rtos/">リアルタイムOS【マイコン開発には必須】</a> first appeared on <a href="https://depfields.com">即戦力モノづくり!エンジニアへの道標</a>.</p>]]></description>
										<content:encoded><![CDATA[<div class="veu_autoEyeCatchBox"><img width="640" height="426" src="https://depfields.com/wp-content/uploads/2020/06/code-820275_640.jpg" class="attachment-large size-large wp-post-image" alt="" decoding="async" srcset="https://depfields.com/wp-content/uploads/2020/06/code-820275_640.jpg 640w, https://depfields.com/wp-content/uploads/2020/06/code-820275_640-300x200.jpg 300w" sizes="(max-width: 640px) 100vw, 640px" /></div>






<h2 class="wp-block-heading">リアルタイムOSとは</h2>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p><strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">OS（オペレーティングシステム）</span></strong>とはコンピュータシステム全体を管理、コントロールしている基本的なソフトウェアのことで、PC、スマートフォン、タブレットで使われているマイクロソフト社のWindows、Google社のAndroid、アップル社のiOSそしてオープンソースのLinuxなどはよく耳にすることがあるかとおもいます。これらは汎用OSと呼ばれるものです。</p>
</div></div></div>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/os.jpg" alt="" class="wp-image-2910" width="388" height="197" srcset="https://depfields.com/wp-content/uploads/2020/06/os.jpg 388w, https://depfields.com/wp-content/uploads/2020/06/os-300x152.jpg 300w" sizes="(max-width: 388px) 100vw, 388px" /><figcaption>オペレーティングシステム（汎用OSとリアルタイムOS）</figcaption></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>PCやタブレット等の使用者はCPU、メモリといったハードウェアとアプリケーションPCやスマートフォンを使うときに汎用OSがあるおかげでアプリケーションの使い方を知るだけでよく、<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">PCの仕組みなどハードウェアを意識する必要はありません</span></strong>。通信プロトコルや画面表示用グラフィックなど多機能がOSに盛り込まれている分サイズは大きいです。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>汎用OSではアプリケーションを<strong>割り当てられた一定時間ごとに切り替える<span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">ラウンドロビンスケジューリング</span></strong>と呼ばれる方式ですので、すぐに処理を行いたいタスクの場合でも、他に実行しているタスクが完了するまで待たなければなりません。そのため、厳密な処理時間を管理するハードウェアのコントロールには向いていません。</p>
</div></div></div>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/normal-os.jpg" alt="" class="wp-image-3049" width="561" height="286"/><figcaption>汎用OS</figcaption></figure>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>組み込みで使用するOSは<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">リアルタイムOS(R</span></strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">eal</span><strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter"> T</span></strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">ime</span><strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter"> O</span></strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">perating</span><strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter"> S</span></strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">ystem</span><strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">)</span></strong>と呼ばれるもので<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">処理時間を予測</span></strong>でき、処理の順番を優先順位で調整して処理時間を厳密に守ることができる<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">リアルタイム性をもって応答速度を重視したOS</span></strong>です。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>実行する各処理のことを<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">タスク（スレッド</span></strong>）と呼び、複数のタスクに優先度を設けてタスクスケジューリングを行います。これを<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">タスク優先度スケジューリング</span></strong>と呼んでいます。ハードウェアをコントロールするための必要な最低限の機能を備えていますので<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">サイズは小さく軽量</span></strong>です。</p>
</div></div></div>



<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://depfields.com/wp-content/uploads/2020/06/realtime-os.jpg" alt="" class="wp-image-2912" width="543" height="256" srcset="https://depfields.com/wp-content/uploads/2020/06/realtime-os.jpg 543w, https://depfields.com/wp-content/uploads/2020/06/realtime-os-300x141.jpg 300w" sizes="(max-width: 543px) 100vw, 543px" /><figcaption>リアルタイムOS</figcaption></figure>



<h2 class="wp-block-heading">組み込みでリアルタイムOSを使う理由</h2>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>アプリケーションで多機能となり処理が複数になってくると、通常に処理を順次実行するだけでは仕様を満たすのは困難です。処理には<strong>実行頻度の多いものがあれば少なくてすむもの</strong>もあります。また、<strong>緊急性の高いものがあれば表示など比較的後回しにしてもよい処理</strong>もあります。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>緊急性の高い処理に関しては通常の処理に混じえて、割り込み処理を多用しなければなりませんが複数の割り込み処理が大部分を占めたプログラムというのもシステムの安定性からみて信頼性があるとはいえません。<strong>優先度も、頻度もまちまちな処理を割り込みだけで構成するのは大変</strong>です。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-right vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>そこでリアルタイムOSの出番です。リアルタイムOSでは処理を<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">タスクという単位</span></strong>で取り扱い、<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">優先度</span></strong>や、<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">処理頻度（間隔）</span></strong>を設定することができます。アプリケーション内で必要に応じてタスクを有効や無効にする<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">タスクの切り替え</span></strong>も簡単にできます。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-right vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>リアルタイムOSを活用することで、<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">複雑で複数の処理を</span></strong>割り込み処理に頼らず、割り込み処理を使用しないときに比べてより<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">シンプルに体系的に記述</span></strong>でき、<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">開発がより簡単に楽に行える</span></strong>ようになります。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>当サイトではリアルタイムOSの紹介として<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">FreeRTOSとSTM32アプリを組み合わせたもの</span></strong>を一部取り上げ解説していきます。特に複数のタスク管理方法とキューについて詳細を解説しています。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>リアルタイムOSは細かな使用方法や設定はOSやマイコンの種類により異なってきますのでつど知識を更新する必要はありますが<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">リアルタイムOSで利用できる基本的な概念はOSやマイコンの種類によらず共通</span></strong>のものですのでここでは<strong>リアルタイムOSを使用しているときのプログラムの流れ</strong>をつかむようにしてください。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>リアルタイムOSを使用したプログラムを構築するのに初めは試行錯誤する部分はありますが、一度完成すると後はテンプレートとして簡単に応用できます。</p>
</div></div></div>



<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img decoding="async" class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://depfields.com/wp-content/uploads/2020/05/instructor.jpg" alt=""/><figcaption class="vk_balloon_icon_name">めかのとろ</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content  "><span class="vk_balloon_content_before "></span><span class="vk_balloon_content_after "></span>
<p>当サイトでは使用する<strong>教材ボードのマイコンに合わせてFreeRTOSの設定を済ませています。</strong>すぐにリアルタイムOSを使用でき、動作確認ができるようになっているので<strong><span data-color="#fffd6b" style="background: linear-gradient(transparent 60%,rgba(255, 253, 107, 0.7) 0);" class="vk_highlighter">マイコンの学習をすすめながらぜひ同時にリアルタイムOSを使ってください</span></strong>。</p>
</div></div></div>


<div class="linkcard"><div class="lkc-external-wrap"><a class="lkc-link no_icon" href="https://en.depfields.com/rtos/" target="_blank" rel="external noopener"><div class="lkc-card"><div class="lkc-info"><img class="lkc-favicon" src="https://www.google.com/s2/favicons?domain=en.depfields.com" alt="" width=16 height=16 /><div class="lkc-domain">Most Powerful Bible to Become an Embedded Engineer</div></div><div class="lkc-content"><figure class="lkc-thumbnail"><img class="lkc-thumbnail-img" src="//depfields.com/wp-content/uploads/pz-linkcard/cache/3a144f0ade8364f4e2d10e60b03de34f38475cd04687a55ddd1fa90e1f50fea0.jpeg" alt="" /></figure><div class="lkc-title"><div class="lkc-title-text">Real-time OS [essential for MCU development] | Most Powerful Bible to Become ...</div></div><div class="lkc-url">https://en.depfields.com/rtos/</div><div class="lkc-excerpt">What is a real-time OS?An operating system (OS) is the basic software that manages and controls the entire computer system.You may have heard of Microsoft Windows, Google&#039;s Android, Apple&#039;s iOS, and the open source Linux used in</div></div><div class="clear"></div></div></a></div></div><p>The post <a href="https://depfields.com/rtos/">リアルタイムOS【マイコン開発には必須】</a> first appeared on <a href="https://depfields.com">即戦力モノづくり!エンジニアへの道標</a>.</p>]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
