<?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>EmbLogic &#187; prakhar_saxena</title>
	<atom:link href="https://www.emblogic.com/blog/author/prakhar_saxena/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.emblogic.com/blog</link>
	<description>Embedded System and ARM Training</description>
	<lastBuildDate>Tue, 03 Mar 2020 13:00:06 +0000</lastBuildDate>
	<language>en-US</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.9.1</generator>
	<item>
		<title>Character Driver VS Block Driver</title>
		<link>https://www.emblogic.com/blog/08/character-driver-vs-block-driver/</link>
		<comments>https://www.emblogic.com/blog/08/character-driver-vs-block-driver/#comments</comments>
		<pubDate>Mon, 18 Aug 2014 18:03:55 +0000</pubDate>
		<dc:creator><![CDATA[prakhar_saxena]]></dc:creator>
				<category><![CDATA[Device Drivers]]></category>

		<guid isPermaLink="false">http://www.emblogic.com/blog/?p=11388</guid>
		<description><![CDATA[There are two main types of devices under all systems, character and block devices. Character devices are those for which no buffering is performed, and block devices are those which are accessed through a cache. Block devices must be random &#8230; <a href="https://www.emblogic.com/blog/08/character-driver-vs-block-driver/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p style="color: #000000">There are two main types of devices under all systems, character and block devices. Character devices are those for which no buffering is performed, and block devices are those which are accessed through a cache. Block devices must be random access, but character devices are not required to be, though some are. Filesystems can only be mounted if they are on block devices.</p>
<p style="color: #000000">Character devices are read from and written to with two function: <tt>foo_read()</tt> and <tt>foo_write()</tt>. The <tt>read()</tt> and <tt>write()</tt> calls do not return until the operation is complete. By contrast, block devices do not even implement the <tt>read()</tt> and <tt>write()</tt> functions, and instead have a function which has historically been called the &#8220;strategy routine.&#8221; Reads and writes are done through the buffer cache mechanism by the generic functions <tt>bread(),</tt> <tt>breada(),</tt> and <tt>bwrite()</tt>. These functions go through the buffer cache, and so may or may not actually call the strategy routine, depending on whether or not the block requested is in the buffer cache (for reads) or on whether or not the buffer cache is full (for writes).</p>
<p style="color: #000000">A request may be asyncronous: <tt>breada()</tt> can request the strategy routine to schedule reads that have not been asked for, and to do it asyncronously, in the background, in the hopes that they will be needed later.</p>
<p style="color: #000000">The sources for character devices are kept in &#8230;/kernel/chr_drv/, and the sources for block devices are kept in &#8230;/kernel/blk_drv/. They have similar interfaces, and are very much alike, except for reading and writing. Because of the difference in reading and writing, initialization is different, as block devices have to register a strategy routine, which is registered in a different way than the <tt>foo_read()</tt> and <tt>foo_write()</tt>routines of a character device driver.</p>
<p style="color: #000000"><img src="http://www.learnlinux.org.za/courses/build/images/diagram40.png" alt="" /></p>
<p style="color: #000000"><img src="http://file.scirp.org/Html/3-6801195%5C5ba8920f-3c9e-4e8f-ba12-58c33a0f142a.jpg" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>https://www.emblogic.com/blog/08/character-driver-vs-block-driver/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Interrupts in Parallel Port</title>
		<link>https://www.emblogic.com/blog/07/interrupts-in-parallel-port/</link>
		<comments>https://www.emblogic.com/blog/07/interrupts-in-parallel-port/#comments</comments>
		<pubDate>Fri, 11 Jul 2014 09:37:28 +0000</pubDate>
		<dc:creator><![CDATA[prakhar_saxena]]></dc:creator>
				<category><![CDATA[Parallel Port Driver]]></category>

		<guid isPermaLink="false">http://www.emblogic.com/blog/?p=10911</guid>
		<description><![CDATA[A parallel port can generate interrupts when the voltage level on a certain input pin changes. The parallel port has to be instructed explicitly to generate interrupts and it is also possible to inhibit interrupts (e.g., while serving a previous &#8230; <a href="https://www.emblogic.com/blog/07/interrupts-in-parallel-port/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<ul>
<li>A parallel port can generate interrupts when the voltage level on a certain input pin changes. The parallel port has to be instructed explicitly to generate interrupts and it is also possible to inhibit interrupts (e.g., while serving a previous interrupt).</li>
<li>The parallel port consists of three bytes in the I/O address space of the PC:
<ol>
<li>The first byte is used as <strong>data port</strong>: 8 bits of output, often labelled D0 to D7, with D0 being the least significant bit and D7 the most significant.</li>
<li>The second byte is used as <strong>status port</strong>: 5 bits of input (S3 &#8211; S7), 3 bits unused (S0 &#8211; S2)</li>
<li>The third byte is used as <strong>control port</strong>:  4 bits of output (C0 &#8211; C3), 4 bits setup/unused (C4 &#8211; C7)</li>
</ol>
</li>
<li>Traditionally, IBM PC systems have allocated their first two parallel ports according to the configuration in the table below:</li>
</ul>
<p>PORT NAME     Interrupt #     Starting I/O   Ending I/O LPT1           IRQ 7          0&#215;378           0x37f LPT2           IRQ 5           0&#215;278           0x27f</p>
<ul>
<li>In this exercise we use LPT1 with IRQ 7 and the following three bytes:
<ol>
<li>0&#215;378 : data port</li>
<li>0&#215;379 : status port</li>
<li>0x37A : control port</li>
</ol>
</li>
<li>The parallel port standard states that setting bit C4 of the control port (0x37A) enables interrupt reporting.</li>
</ul>
<p>The pins of the 25 pin female D type parallel port connector are shown in the following picture</p>
<ul>
<li>In this picture all green pins (numbered 18 &#8211; 25) are grounded at 0 Volt.</li>
<li>When having interrupts enabled (i.e., bit C4 has been set), an interrupt will be generated by the parallel port when the voltage on input line S6 (pin 10) is raised from 0 Volt to +5 Volt. By default the input line is kept high to +5 Volt when nothing is connected. Observe that when pin 10 is shortly shorted to one of the pins 19-25, i.e., to ground, an interrupt on IRQ line 7 will be generated by the parallel port. The interrupt is generated at exactly the moment that you undo the shortage, since at that exact moment the line is raised from 0 to +5 Volt.</li>
</ul>
<p><img src="http://www.pstnet.com/internal/kbimage/1320-1.gif" alt="http://www.pstnet.com/internal/kbimage/1320-1.gif" /></p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>https://www.emblogic.com/blog/07/interrupts-in-parallel-port/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kernel Timers</title>
		<link>https://www.emblogic.com/blog/06/kernel-timers/</link>
		<comments>https://www.emblogic.com/blog/06/kernel-timers/#comments</comments>
		<pubDate>Fri, 20 Jun 2014 06:16:58 +0000</pubDate>
		<dc:creator><![CDATA[prakhar_saxena]]></dc:creator>
				<category><![CDATA[Character Driver]]></category>

		<guid isPermaLink="false">http://www.emblogic.com/blog/?p=10569</guid>
		<description><![CDATA[Timers are used to schedule execution of a function (a timer handler) at a particular time in the future. They thus work differently from task queues and in that you can specify when in the future your function will be &#8230; <a href="https://www.emblogic.com/blog/06/kernel-timers/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p><a name="INDEX-1,610"></a>Timers are used to schedule execution of a function (a timer handler) at a particular time in the future. They thus work differently from task queues and in that you can specify <em class="emphasis">when</em> in the future your function will be called, whereas you can&#8217;t tell exactly when a queued task will be executed. On the other hand, kernel timers are similar to task queues in that a function registered in a kernel timer is executed only once &#8212; timers aren&#8217;t cyclic.</p>
<p><a name="INDEX-1,610"></a>A timer is much easier to use. You register your function once, and the kernel calls it once when the timer expires. Such a functionality is used often within the kernel proper, but it is sometimes needed by the drivers as well, as in the example of the floppy motor. <a name="INDEX-1,612"></a>A timer is characterized by its time-out value (in jiffies) and the function to be called when the timer expires. The timer handler receives an argument, which is stored in the data structure, together with a pointer to the handler itself.</p>
<p><a name="INDEX-1,615"></a>The data structure of a timer looks like the following, which is extracted from <tt class="literal">&lt;linux/timer.h&gt;</tt>): <a name="INDEX-1,615"></a></p>
<blockquote>
<pre class="code"> struct timer_list {
     unsigned long expires;            /* the timeout, in jiffies */
     unsigned long data;               /* argument to the handler */
     void (*function)(unsigned long);  /* handler of the timeout */
     };
<a name="INDEX-1,617"></a></pre>
</blockquote>
<pre class="code">These are the functions used to act on timers:</pre>
<ul>
<li><a name="INDEX-1,617"></a><b><tt class="literal">void init_timer(struct timer_list *timer);</tt></b></li>
</ul>
<ul>
<li><a name="INDEX-1,618"></a><b><tt class="literal">void add_timer(struct timer_list *timer);</tt></b></li>
</ul>
<ul>
<li><a name="INDEX-1,620"></a><b><tt class="literal">int del_timer(struct timer_list *timer);</tt></b></li>
</ul>
<p><a name="INDEX-1,624"></a>The code for <em class="filename">/proc/jitimer</em> is as follows:</p>
<p>struct jit_data{</p>
<p>struct timer_list timer;</p>
<p>unsigned long prev-jiffies;</p>
<p>unsigned char*buff;</p>
<p>};</p>
<p><img id="irc_mi" style="margin-top: 195px" src="http://www.at91.com/linux4sam/pub/Linux4SAM/RealTime/latency_kernel_timer.png" alt="" width="552" height="287" /></p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>https://www.emblogic.com/blog/06/kernel-timers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What is Python?</title>
		<link>https://www.emblogic.com/blog/06/what-is-python/</link>
		<comments>https://www.emblogic.com/blog/06/what-is-python/#comments</comments>
		<pubDate>Sun, 01 Jun 2014 15:05:18 +0000</pubDate>
		<dc:creator><![CDATA[prakhar_saxena]]></dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.emblogic.com/blog/?p=10254</guid>
		<description><![CDATA[Python is an interpreted, object-oriented, high-level programming language with dynamic semantics. Its high-level built in data structures, combined with dynamic typing and dynamic binding, make it very attractive for Rapid Application Development, as well as for use as a scripting &#8230; <a href="https://www.emblogic.com/blog/06/what-is-python/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p><span style="color: #666666">Python is an interpreted, object-oriented, high-level programming language with dynamic semantics. Its high-level built in data structures, combined with dynamic typing and dynamic binding, make it very attractive for Rapid Application Development, as well as for use as a scripting or glue language to connect existing components together. Python&#8217;s simple, easy to learn syntax emphasizes readability and therefore reduces the cost of program maintenance. Python supports modules and packages, which encourages program modularity and code reuse. The Python interpreter and the extensive standard library are available in source or binary form without charge for all major platforms, and can be freely distributed.</span></p>
<p><strong>Advantage:</strong></p>
<p><span style="color: #333333">1. Python code has to be strictly indented but the indentation helps in much cleaner code(readable).</span><br style="color: #333333" /><span style="color: #333333">2. High level data structures are list, directory are well suited in python. </span><br style="color: #333333" /><span style="color: #333333">3. Easy to write, easy to read and easy to understand.</span></p>
<p><strong>Example:</strong></p>
<pre style="color: #333333"><span class="k" style="font-weight: bold;color: #007020">print</span> <span class="s" style="color: #4070a0">'{0} and {1}'</span><span class="o" style="color: #666666">.</span><span class="n">format</span><span class="p">(</span><span class="s" style="color: #4070a0">'spam'</span><span class="p">,</span> <span class="s" style="color: #4070a0">'eggs'</span><span class="p">)</span>
<span class="go" style="color: #303030">Output=spam and eggs</span></pre>
]]></content:encoded>
			<wfw:commentRss>https://www.emblogic.com/blog/06/what-is-python/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>LSEEK() system call</title>
		<link>https://www.emblogic.com/blog/05/lseek-system-call/</link>
		<comments>https://www.emblogic.com/blog/05/lseek-system-call/#comments</comments>
		<pubDate>Wed, 28 May 2014 18:58:26 +0000</pubDate>
		<dc:creator><![CDATA[prakhar_saxena]]></dc:creator>
				<category><![CDATA[Data Structures with C]]></category>

		<guid isPermaLink="false">http://www.emblogic.com/blog/?p=10226</guid>
		<description><![CDATA[The lseek() function repositions the offset of the file descriptor fildes to the argument offset according to the directive whence. The argument fildes must be an open file descriptor. Lseek() repositions the file position pointer associated with the file descriptor &#8230; <a href="https://www.emblogic.com/blog/05/lseek-system-call/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<pre style="color: #000000"></pre>
<hr />
<pre style="color: #000000">The <b>lseek</b>() function repositions the offset of the file descriptor <i>fildes </i>to the argument <i>offset</i> according to the directive <i>whence.
</i>The argument <i>fildes</i> must be an open file descriptor. 
<b>Lseek</b>() repositions the file position pointer associated with the file descriptor <i>fildes</i> as follows:
</pre>
<ul>
<li>If <i style="font-size: 15px">whence</i> is SEEK_SET, the offset is set to <i style="font-size: 15px">offset</i> bytes.</li>
<li>If <i style="font-size: 15px">whence</i> is SEEK_CUR, the offset is set to its current location plus <i>offset</i> bytes.</li>
</ul>
<ul>
<li>If <i style="font-size: 15px">whence</i> is SEEK_END, the offset is set to the size of the file plus <i>offset</i> bytes.</li>
</ul>
<pre style="color: #000000">The <b>lseek</b>() function allows the file offset to be set beyond the end of the existing end-of-file of the file.
If data is later written at this point, subsequent reads of the data in the gap return bytes of zeros (until data is actually written into the gap).

Some devices are incapable of seeking. The value of the pointer   associated with such a device is undefined.
Upon successful completion, <b>lseek</b>() returns the resulting offset location as measured in bytes from the beginning of the file.Otherwise, a value of -1 is returned and <i>errno</i> is set to indicate the error.</pre>
]]></content:encoded>
			<wfw:commentRss>https://www.emblogic.com/blog/05/lseek-system-call/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Memset,Memmove,Memcopy Function</title>
		<link>https://www.emblogic.com/blog/05/memsetmemmovememcopy-function/</link>
		<comments>https://www.emblogic.com/blog/05/memsetmemmovememcopy-function/#comments</comments>
		<pubDate>Thu, 22 May 2014 05:02:25 +0000</pubDate>
		<dc:creator><![CDATA[prakhar_saxena]]></dc:creator>
				<category><![CDATA[Project 11: A Character Device Drivers Based Project]]></category>

		<guid isPermaLink="false">http://www.emblogic.com/blog/?p=10166</guid>
		<description><![CDATA[The memset() Function To set all the bytes in a block of memory to a particular value, use memset(). The function prototype is void * memset(void *dest, int c, size_t count); The argument dest points to the block of memory. &#8230; <a href="https://www.emblogic.com/blog/05/memsetmemmovememcopy-function/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<h3><strong>The memset() Function</strong></h3>
<p>To set all the bytes in a block of memory to a particular value, use memset(). The function prototype is</p>
<p><code>void * memset(void </code><em><code>*dest</code></em><code>, int </code><em><code>c</code></em><code>, size_t </code><em><code>count</code></em><code>); </code></p>
<p>The argument dest points to the block of memory. c is the value to set, and <i>count</i> is the number of bytes, starting at dest, to be set. Note that while c is a type int, it is treated as a type char. In other words, only the low-order byte is used, and you can specify values of c only in the range 0 through 255.</p>
<p>Use memset() to initialize a block of memory to a specified value. Because this function can use only a type char as the initialization value, it is not useful for working with blocks of data types other than type char, except when you want to initialize to 0. In other words, it wouldn&#8217;t be efficient to use memset() to initialize an array of type int to the value 99, but you could initialize all array elements to the value 0.</p>
<h3><strong>The memcpy() Function</strong></h3>
<p>memcpy() copies bytes of data between memory blocks, sometimes called <i>buffers</i>. This function doesn&#8217;t care about the type of data being copied&#8211;it simply makes an exact byte-for-byte copy. The function prototype is</p>
<p><code>void *memcpy(void *dest, void *src, size_t <i>count</i>); </code></p>
<p>The arguments dest and src point to the destination and source memory blocks, respectively. <i>count</i> specifies the number of bytes to be copied. The return value is dest. If the two blocks of memory overlap, the function might not operate properly&#8211;some of the data in src might be overwritten before being copied.</p>
<h3><strong>The memmove() Function</strong></h3>
<p>memmove() is very much like memcpy(), copying a specified number of bytes from one memory block to another. It&#8217;s more flexible, however, because it can handle overlapping memory blocks properly. Because memmove() can do everything memcpy() can do with the added flexibility of dealing with overlapping blocks. The prototype is</p>
<p><code>void *memmove(void *dest, void *src, size_t <i>count</i>); </code></p>
<p>dest and src point to the destination and source memory blocks, and <i>count</i> specifies the number of bytes to be copied. The return value is dest. If the blocks overlap, this function ensures that the source data in the overlapped region is copied before being overwritten.</p>
]]></content:encoded>
			<wfw:commentRss>https://www.emblogic.com/blog/05/memsetmemmovememcopy-function/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Threads Vs Processes</title>
		<link>https://www.emblogic.com/blog/05/threads-vs-processes/</link>
		<comments>https://www.emblogic.com/blog/05/threads-vs-processes/#comments</comments>
		<pubDate>Mon, 12 May 2014 07:55:02 +0000</pubDate>
		<dc:creator><![CDATA[prakhar_saxena]]></dc:creator>
				<category><![CDATA[Project 04: FTP based Client Server using Threads and Sockets]]></category>

		<guid isPermaLink="false">http://www.emblogic.com/blog/?p=10010</guid>
		<description><![CDATA[Difference Between threads and processes Following are some of the major differences between the thread and the processes : Processes do not share their address space while threads executing under same process share the address space. From the above point &#8230; <a href="https://www.emblogic.com/blog/05/threads-vs-processes/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<h3>Difference Between threads and processes</h3>
<p>Following are some of the major differences between the thread and the processes :</p>
<ul>
<li>Processes do not share their address space while threads executing under same process share the address space.</li>
<li>From the above point its clear that processes execute independent of each other and the synchronization between processes is taken care by kernel only while on the other hand the thread synchronization has to be taken care by the process under which the threads are executing</li>
<li>Context switching between threads is fast as compared to context switching between processes</li>
<li>The interaction between two processes is achieved only through the standard inter process communication while threads executing under the same process can communicate easily as they share most of the resources like memory, text segment etc</li>
</ul>
<h3>User threads Vs Kernel Threads</h3>
<p>Threads can exist in user space as well as in kernel space.</p>
<p>A <strong>user space</strong> threads are created, controlled and destroyed using user space thread libraries. These threads are not known to kernel and hence kernel is nowhere involved in their processing. These threads follow co-operative multitasking where-in a thread releases CPU on its own wish ie the scheduler cannot preempt the thread. Th advantages of user space threads is that the switching between two threads does not involve much overhead and is generally very fast while on the negative side since these threads follow co-operative multitasking so if one thread gets block the whole process gets blocked.</p>
<p>A <strong>kernel space</strong> thread is created, controlled and destroyed by the kernel. For every thread that exists in user space there is a corresponding kernel thread. Since these threads are managed by kernel so they follow preemptive multitasking where-in the scheduler can preempt a thread in execution with a higher priority thread which is ready for execution. The major advantage of kernel threads is that even if one of the thread gets blocked the whole process is not blocked as kernel threads follow preemptive scheduling while on the negative side the context switch is not very fast as compared to user space threads.</p>
<p>If we talk of Linux then kernel threads are optimized to such an extent that they are considered better than user space threads and mostly used in all scenarios except where prime requirement is that of cooperative multitasking.</p>
<p><img id="irc_mi" style="margin-top: 15px" src="http://www.silicom-usa.com/upload/solutions/tnapi.jpg" alt="" width="520" height="363" /></p>
]]></content:encoded>
			<wfw:commentRss>https://www.emblogic.com/blog/05/threads-vs-processes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Socket</title>
		<link>https://www.emblogic.com/blog/05/socket-6/</link>
		<comments>https://www.emblogic.com/blog/05/socket-6/#comments</comments>
		<pubDate>Sun, 11 May 2014 11:40:24 +0000</pubDate>
		<dc:creator><![CDATA[prakhar_saxena]]></dc:creator>
				<category><![CDATA[Project 04: FTP based Client Server using Threads and Sockets]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.emblogic.com/blog/?p=9941</guid>
		<description><![CDATA[A socket is one end-point of a two-way communication link between two programs running on the network. A server application normally listens to a specific port waiting for connection requests from a client. When a connection request arrives, the client &#8230; <a href="https://www.emblogic.com/blog/05/socket-6/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>A socket is one end-point of a two-way communication link between two programs running on the network.</p>
<p>A server application normally listens to a specific port waiting for connection requests from a client. When a connection request arrives, the client and the server establish a dedicated connection over which they can communicate. During the connection process, the client is assigned a local port number, and binds a <em>socket</em> to it. The client talks to the server by writing to the socket and gets information from the server by reading from it. Similarly, the server gets a new local port number (it needs a new port number so that it can continue to listen for connection requests on the original port). The server also binds a socket to its local port and communicates with the client by reading from and writing to it.</p>
<p>The client and the server must agree on a protocol&#8211;that is, they must agree on the language of the information transferred back and forth through the socket.</p>
<p><img id="irc_mi" style="margin-top: 66px" src="http://www.troubleshooters.com/lpm/200803/images/server_app.png" alt="" width="604" height="262" /></p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>https://www.emblogic.com/blog/05/socket-6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GRUB</title>
		<link>https://www.emblogic.com/blog/04/grub/</link>
		<comments>https://www.emblogic.com/blog/04/grub/#comments</comments>
		<pubDate>Mon, 21 Apr 2014 08:19:38 +0000</pubDate>
		<dc:creator><![CDATA[prakhar_saxena]]></dc:creator>
				<category><![CDATA[Project 9: Embedded Linux on ARM]]></category>

		<guid isPermaLink="false">http://www.emblogic.com/blog/?p=9872</guid>
		<description><![CDATA[GNU GRUB is a bootloader capable of loading a variety of free and proprietary operating systems. GRUB will work well with Linux, DOS, Windows, or BSD. GRUB stands for GRand Unified Bootloader. GRUB is dynamically configurable. This means that the &#8230; <a href="https://www.emblogic.com/blog/04/grub/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>GNU GRUB is a bootloader capable of loading a variety of free and proprietary operating systems. GRUB will work well with Linux, DOS, Windows, or BSD. GRUB stands for GRand Unified Bootloader.</p>
<p>GRUB is dynamically configurable. This means that the user can make changes during the boot time, which include altering existing boot entries, adding new, custom entries, selecting different kernels, or modifying <a href="http://en.wikipedia.org/wiki/Initrd">initrd</a>. GRUB also supports <a href="http://en.wikipedia.org/wiki/Logical_Block_Address">Logical Block Address</a> mode. This means that if your computer has a fairly modern BIOS that can access more than 8GB (first 1024 cylinders) of hard disk space, GRUB will automatically be able to access all of it.</p>
<p>GRUB can be run from or be installed to any device (floppy disk, hard disk, CD-ROM, USB drive, network drive) and can load operating systems from just as many locations, including network drives. It can also decompress operating system images before booting them.</p>
]]></content:encoded>
			<wfw:commentRss>https://www.emblogic.com/blog/04/grub/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Message Queues</title>
		<link>https://www.emblogic.com/blog/04/message-queues-9/</link>
		<comments>https://www.emblogic.com/blog/04/message-queues-9/#comments</comments>
		<pubDate>Tue, 01 Apr 2014 10:28:06 +0000</pubDate>
		<dc:creator><![CDATA[prakhar_saxena]]></dc:creator>
				<category><![CDATA[Project 03: Client Server Communication using Linux and IPC]]></category>

		<guid isPermaLink="false">http://www.emblogic.com/blog/?p=9742</guid>
		<description><![CDATA[Message queue is a circular queue which transfer data by giving a tag,tag is generally the id of the data package to be transfered and it differentiates the data from one another. Message queuing allows distributed applications to communicate asynchronously &#8230; <a href="https://www.emblogic.com/blog/04/message-queues-9/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Message queue is a circular queue which transfer data by giving a tag,tag is generally the id of the data package to be transfered and it differentiates the data from one another.</p>
<p>Message queuing allows distributed applications to communicate asynchronously by sending messages between the applications.  The messages from the sending application are stored in a queue and are retrieved by the receiving application.  The applications send or receive messages through a queue by sending a request to the message queuing system.  Sending and receiving applications can use the same message queuing system or different ones, allowing the message queuing system to handle the forwarding of the messages from the sender queue to the recipient queue.</p>
<p>Queued messages can be stored at intermediate nodes until the system is ready to forward them to the next node.  At the destination node, the messages are stored in a queue until the receiving application retrieves them from the queue.  Message delivery is guaranteed even if the network or application fails.  This provides for a reliable communication channel between the applications.</p>
<p>The complexity and details of the underlying model (to store and forward messages between different environments) are handled by the message queuing system.  By maintaining this level of abstraction, distributed applications can be developed without the need to worry about the details of how the information is transported.</p>
<p>Because the sending and receiving applications operate independently of one another, the sending application is less dependent on the availability of the remote application, less dependent on the network between them, and less dependent on the computer system on which the receiving application runs.  This leads to a higher level of availability for the participating applications.</p>
<p>Messages and message queue operations can be configured by the applications to operate in specific modes.  For example, a sending application can specify that queued messages should survive system crashes.  As another example, the receiving application can specify a maximum waiting period for a receiving operation from a queue (in case no messages are available yet on the receiving queue).</p>
]]></content:encoded>
			<wfw:commentRss>https://www.emblogic.com/blog/04/message-queues-9/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Semaphore</title>
		<link>https://www.emblogic.com/blog/03/semaphore-3/</link>
		<comments>https://www.emblogic.com/blog/03/semaphore-3/#comments</comments>
		<pubDate>Tue, 25 Mar 2014 08:51:22 +0000</pubDate>
		<dc:creator><![CDATA[prakhar_saxena]]></dc:creator>
				<category><![CDATA[Project 03: Client Server Communication using Linux and IPC]]></category>

		<guid isPermaLink="false">http://www.emblogic.com/blog/?p=9339</guid>
		<description><![CDATA[Its a synchronization mechanism in which one process can access shared resource at one time and other processes are in a wait stage.Its used in synchronizing multiple processes.The processes are in a queue,when semaphore increments or when its greater than &#8230; <a href="https://www.emblogic.com/blog/03/semaphore-3/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Its a synchronization mechanism in which one process can access shared resource at one time and other processes are in a wait stage.Its used in synchronizing multiple processes.The processes are in a queue,when semaphore increments or when its greater than zero then all the process pops out of the queue and only one process enter the critical region,when a process enters the critical region it decrements semaphore and after process completion it exits increments and exits the semaphore.The increment operation is known as a &#8220;signal&#8221; and decrement operation is &#8220;wait&#8221;.</p>
<p>To make a semaphore,its variable should be greater the zero.To initialize a Semaphore 3 function definition are used :</p>
<p>1. kernel key=<em>segmet</em>(user key,no. of semaphores,666|IPC_CREAT);</p>
<p>2. <em>semctl(</em>kernel key,index,command,&#8230;<strong>(optional)</strong>)<strong>;</strong></p>
<p>3. <em>semop</em>(kernel key,struct sembuf*<span style="color: #000000">sops,size of sops);</span></p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>https://www.emblogic.com/blog/03/semaphore-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>fork</title>
		<link>https://www.emblogic.com/blog/03/fork-2/</link>
		<comments>https://www.emblogic.com/blog/03/fork-2/#comments</comments>
		<pubDate>Thu, 06 Mar 2014 04:20:41 +0000</pubDate>
		<dc:creator><![CDATA[prakhar_saxena]]></dc:creator>
				<category><![CDATA[Data Structures with C]]></category>

		<guid isPermaLink="false">http://www.emblogic.com/blog/?p=8902</guid>
		<description><![CDATA[fork is an operation or a process which creates a copy of itself. It is usually a system call, implemented in the kernel. Fork is the primary method of process creation on Unix-like operating systems. If fork() returns a negative &#8230; <a href="https://www.emblogic.com/blog/03/fork-2/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p><strong>fork</strong> is an operation or a process which creates a copy of itself. It is usually a system call, implemented in the kernel. Fork is the primary method of process creation on Unix-like operating systems.</p>
<ul>
<li>If <strong>fork()</strong> returns a negative value, the creation of a child process was unsuccessful.</li>
<li><strong>fork()</strong> returns a zero to the newly created child process.</li>
<li><strong>fork()</strong> returns a positive value, the <strong><em>process ID</em></strong> of the child process, to the parent. The returned process ID is of type <strong>pid_t</strong> defined in <span style="font-family: Helvetica"><strong>sys/types.h</strong></span>. Normally, the process ID is an integer. Moreover, a process can use function <strong>getpid()</strong> to retrieve the process ID assigned to this process.</li>
</ul>
<p>Due to the fact that the CPU scheduler will assign a particular time to each process, the parent or the child process will run for some time.After the calling of system call FORK the program counter of both will run simultaneously.</p>
]]></content:encoded>
			<wfw:commentRss>https://www.emblogic.com/blog/03/fork-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bit Recognition Time</title>
		<link>https://www.emblogic.com/blog/03/bit-recognition-time/</link>
		<comments>https://www.emblogic.com/blog/03/bit-recognition-time/#comments</comments>
		<pubDate>Mon, 03 Mar 2014 08:03:05 +0000</pubDate>
		<dc:creator><![CDATA[prakhar_saxena]]></dc:creator>
				<category><![CDATA[Data Structures with C]]></category>

		<guid isPermaLink="false">http://www.emblogic.com/blog/?p=8826</guid>
		<description><![CDATA[Time taken to give low input or low voltage plus closing of a switch and the propagation time is known as Bit Recognition Time(BRT).The switch is connected to the Flip Flop,thus input is entered into the flip flop. If threshold &#8230; <a href="https://www.emblogic.com/blog/03/bit-recognition-time/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Time taken to give low input or low voltage plus closing of a switch and the propagation time is known as Bit Recognition Time(BRT).The switch is connected to the Flip Flop,thus input is entered into the flip flop.</p>
<p>If threshold voltage is crossover in BRT then its an invalid bit,if not crossover then its a valid bit.Bit is a small unit of information or data.Low input is logical 0.</p>
]]></content:encoded>
			<wfw:commentRss>https://www.emblogic.com/blog/03/bit-recognition-time/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
