<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Mohamed ali May</title>
    <description>The latest articles on Forem by Mohamed ali May (@dalimay28).</description>
    <link>https://forem.com/dalimay28</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F36427%2F1dfe267f-6e5a-456b-ae49-8ffc32527204.jpg</url>
      <title>Forem: Mohamed ali May</title>
      <link>https://forem.com/dalimay28</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/dalimay28"/>
    <language>en</language>
    <item>
      <title>Solving Claude's Amnesia: Building Persistent Memory with MCP</title>
      <dc:creator>Mohamed ali May</dc:creator>
      <pubDate>Wed, 11 Feb 2026 12:14:50 +0000</pubDate>
      <link>https://forem.com/dalimay28/how-i-built-memcp-giving-claude-a-real-memory-15co</link>
      <guid>https://forem.com/dalimay28/how-i-built-memcp-giving-claude-a-real-memory-15co</guid>
      <description>&lt;p&gt;As a solo developer working on his next idea, Claude has been my pair programming partner for months now, and honestly, it's been incredible, except for one problem that kept driving me crazy:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Every time I hit &lt;code&gt;/compact&lt;/code&gt;, Claude forgets everything we just worked on.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;All those architecture decisions we debated? Gone. That bug fix we finally figured out? Vanished. Client preferences I mentioned three times? Claude asks again. It's like Groundhog Day, except I'm the one who has to repeat myself.&lt;/p&gt;

&lt;p&gt;Until one evening, when I closed my laptop in frustration and made myself some coffee and decided to dig deeper in the topic. After hours of reading, I found two papers that completely changed my life: &lt;strong&gt;&lt;a href="https://arxiv.org/abs/2512.24601" rel="noopener noreferrer"&gt;Recursive Language Models&lt;/a&gt;&lt;/strong&gt; from MIT and &lt;strong&gt;&lt;a href="https://arxiv.org/abs/2601.03236" rel="noopener noreferrer"&gt;MAGMA&lt;/a&gt;&lt;/strong&gt; about multi-graph memory architecture.&lt;/p&gt;

&lt;p&gt;That's when it clicked. I could build a memory system that works the way I actually think.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I built
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;MemCP&lt;/strong&gt; is an MCP server that plugs into Claude Code. Here's what makes it different:&lt;/p&gt;

&lt;h3&gt;
  
  
  Never lose context again
&lt;/h3&gt;

&lt;p&gt;MemCP watches for &lt;code&gt;/compact&lt;/code&gt; commands. When you hit it, Claude gets blocked with "save your work first" until it actually saves insights and context. No more silent memory wipes.&lt;/p&gt;

&lt;p&gt;There's also gentle reminders every 10 turns if Claude hasn't saved anything yet.&lt;/p&gt;

&lt;h3&gt;
  
  
  Two types of storage
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Memory&lt;/strong&gt; is for insights like decisions, facts, preferences, findings. Small pieces of knowledge that matter.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Contexts&lt;/strong&gt; are for big stuff such as entire files, docs, logs. These stay on disk. Claude can inspect metadata (file type, size, tokens) without loading anything. Then peek at specific sections, grep for patterns, or chunk into navigable pieces.&lt;/p&gt;

&lt;h3&gt;
  
  
  Knowledge that connects itself
&lt;/h3&gt;

&lt;p&gt;Every time Claude saves an insight, MemCP automatically builds connections:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Links to similar ideas&lt;/li&gt;
&lt;li&gt;Links to things from the same work session
&lt;/li&gt;
&lt;li&gt;Links cause-and-effect (it detects "because" and "therefore" in text)&lt;/li&gt;
&lt;li&gt;Links things mentioning the same files or modules&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So when you ask "why did we make that choice?", it doesn't just keyword search, it follows the cause-and-effect chain.&lt;/p&gt;

&lt;h3&gt;
  
  
  Search that improves as you go
&lt;/h3&gt;

&lt;p&gt;Start with basic install? Keyword search works fine.&lt;/p&gt;

&lt;p&gt;Add one package? You get ranked search.&lt;/p&gt;

&lt;p&gt;Add another? Typo tolerance.&lt;/p&gt;

&lt;p&gt;Add embeddings? Searches understand meaning, not just words.&lt;/p&gt;

&lt;p&gt;The system automatically uses the best method available. No config needed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Navigation tools for large files
&lt;/h3&gt;

&lt;p&gt;Say you have a 50,000-line codebase file. Instead of dumping it into context:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Inspect&lt;/strong&gt; it first (see type, size, preview and costs zero tokens)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chunk&lt;/strong&gt; it into sections&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Peek&lt;/strong&gt; at just section 5&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Filter&lt;/strong&gt; for only function definitions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You control what enters your context window.&lt;/p&gt;

&lt;h3&gt;
  
  
  Smart cleanup
&lt;/h3&gt;

&lt;p&gt;After 30 days, unused stuff gets compressed and archived automatically. Important things (marked critical, accessed frequently, tagged "keep") stay active.&lt;/p&gt;

&lt;p&gt;If you need archived content later, it restores instantly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick install
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;claude-memory-mcp
bash &amp;lt;&lt;span class="o"&gt;(&lt;/span&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; https://raw.githubusercontent.com/maydali28/memcp/main/scripts/install.sh&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two minutes. Restart Claude Code. Done.&lt;/p&gt;

&lt;h2&gt;
  
  
  What difference does it make?
&lt;/h2&gt;

&lt;p&gt;I ran benchmarks comparing normal usage vs. MemCP:&lt;/p&gt;

&lt;p&gt;Loading 500 insights normally costs 9,380 tokens. With MemCP? 462 tokens. That's 20x less.&lt;/p&gt;

&lt;p&gt;Analyzing a massive 50K token document? Normally costs 50,460 tokens (eats your whole context). With MemCP? 231 tokens because you're just peeking at metadata and specific chunks. That's 218x less.&lt;/p&gt;

&lt;p&gt;But the real killer stat: after &lt;code&gt;/compact&lt;/code&gt;, normal mode loses almost everything. MemCP keeps 100% of your stored knowledge.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real workflow example
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Morning session:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;memcp_remember("User sessions expire after 1 hour, use Redis for storage", 
              category="decision", importance="critical", tags="auth,redis")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Three days later:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;memcp_recall(query="how long do sessions last?")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude instantly recalls the decision, sees it was tagged critical, knows it's about auth and Redis. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Working with large files:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;memcp_load_context("api-routes", file_path="src/api/routes.py")
memcp_inspect_context("api-routes")  // Shows: python file, 2400 lines, ~15K tokens
memcp_filter_context("api-routes", pattern="def\\s+\\w+")  // Just function names
memcp_chunk_context("api-routes", strategy="lines", chunk_size=100)  // 24 chunks
memcp_peek_chunk("api-routes", 5)  // Read chunk 5 only
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You navigate the file like a filesystem, not cramming it into context.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it matters for solo devs
&lt;/h2&gt;

&lt;p&gt;When you're building alone, you can't afford to waste time re-explaining yesterday's decisions. MemCP gave me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No more context anxiety&lt;/li&gt;
&lt;li&gt;Sessions that build on previous work automatically
&lt;/li&gt;
&lt;li&gt;Ability to work with huge files without thinking about token limits&lt;/li&gt;
&lt;li&gt;Decisions from last month still accessible today&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The three weeks I spent building this paid back in productivity within the first month.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;MemCP is open source (MIT):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/maydali28/memcp" rel="noopener noreferrer"&gt;memcp&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PyPi:&lt;/strong&gt; &lt;a href="https://pypi.org/project/claude-memory-mcp/" rel="noopener noreferrer"&gt;claude-memory-mcp&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RLM paper:&lt;/strong&gt; &lt;a href="https://arxiv.org/abs/2512.24601" rel="noopener noreferrer"&gt;RLM paper&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MAGMA paper:&lt;/strong&gt; &lt;a href="https://arxiv.org/abs/2601.03236" rel="noopener noreferrer"&gt;MAGMA paper&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;21 tools. Zero mandatory dependencies. Works out of the box.&lt;/p&gt;

&lt;p&gt;If you've ever hit &lt;code&gt;/compact&lt;/code&gt; and felt that sinking feeling watching your context disappear, give it a try. Stars and feedback appreciated.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If this helped, drop a heart below!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;PS: Yes, Claude helped me build its own memory system. Meta, I know.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>mcp</category>
      <category>python</category>
    </item>
    <item>
      <title>Using docker for embedded systems development</title>
      <dc:creator>Mohamed ali May</dc:creator>
      <pubDate>Mon, 09 Oct 2017 16:30:54 +0000</pubDate>
      <link>https://forem.com/dalimay28/using-docker-for-embedded-systems-development-b16</link>
      <guid>https://forem.com/dalimay28/using-docker-for-embedded-systems-development-b16</guid>
      <description>&lt;p&gt;One of the top challenges that I have faced while working on some projects is updating the state of my entire work machine and some times breaking something unrelated, and this problem gets me crazy every time. As a fan of software development as well as embedded systems, I decided to mix the two disciplines and use virtual machines to solve this issue, by building an isolated environment for embedded systems development.&lt;/p&gt;

&lt;p&gt;This may seem like a stretch, but the traditional way to do this is to create a virtual machine, install Linux, then install the packages we need for cross compiling, edit the code on the host machine, switch to the VM, compile and repeat the process every time. This is too slow and heavy and it's not fun.&lt;/p&gt;

&lt;h4&gt;
  
  
  So why do we need to use docker?
&lt;/h4&gt;

&lt;p&gt;Well because it offers us an efficient and speedy way to port applications across systems and machines. It is light and lean, allowing you to quickly containerize applications and run them within their own secure environments.&lt;/p&gt;

&lt;h2&gt;
  
  
  background :
&lt;/h2&gt;

&lt;p&gt;My goal is setting up an isolated and repeatable environment for developing STM32 applications using docker that encompasses all the needed resources and the automation we are using, also add a shared directory between the host file system and our docker container so that we don't need to copy the code every time to the VM and restart it.&lt;/p&gt;

&lt;p&gt;Once all of this is ready, we can quickly start a development environment on our machine without having to worry about finding, installing, and configuring project dependencies every time we need it.&lt;/p&gt;

&lt;p&gt;our final result features :&lt;br&gt;
-Docker build files and Ubuntu 14.04LTS image;&lt;br&gt;
-GNU ARM toolchain;&lt;br&gt;
-GDB for debugging application;&lt;br&gt;
-OpenOCD as GDB server;&lt;br&gt;
-Example of LED blink Project for stm32F4;&lt;/p&gt;

&lt;p&gt;The project originally is cloned from &lt;a href="https://github.com/rowol/stm32_discovery_arm_gcc/blob/master/README.md" rel="noopener noreferrer"&gt;Here&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Let's start
&lt;/h2&gt;

&lt;p&gt;before we start you must setup docker, you can check the installation instructions &lt;a href="https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/" rel="noopener noreferrer"&gt;Here&lt;/a&gt; from the official docker website. All the code of this tutorial is available on github. so go clone or fork the project now so you can have all the code to build, compile and modify it.&lt;/p&gt;
&lt;h4&gt;
  
  
  Write Dockerfile:
&lt;/h4&gt;

&lt;p&gt;The container with our application is a little more interesting :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    #the first thing we need to do is define from what image we want to build from.
    #Here we will use a 14.04 LTS(long term support) version of ubuntu from docker Hub :
    FROM ubuntu:14.04

    MAINTAINER Mohamed Ali May "https://github.com/maydali28"

    ARG DEBIAN_FRONTEND=noninteractive

    RUN mv /etc/apt/sources.list /etc/apt/sources.list.old
    RUN echo 'deb mirror://mirrors.ubuntu.com/mirrors.txt trusty main restricted universe multiverse' &amp;gt;&amp;gt; /etc/apt/sources.list
    RUN echo 'deb mirror://mirrors.ubuntu.com/mirrors.txt trusty-updates main restricted universe multiverse' &amp;gt;&amp;gt; /etc/apt/sources.list
    RUN echo 'deb mirror://mirrors.ubuntu.com/mirrors.txt trusty-backports main restricted universe multiverse' &amp;gt;&amp;gt; /etc/apt/sources.list
    RUN echo 'deb mirror://mirrors.ubuntu.com/mirrors.txt trusty-security main restricted universe multiverse' &amp;gt;&amp;gt; /etc/apt/sources.list
    RUN apt-get update -q
    #install software requirements
    RUN apt-get install --no-install-recommends -y software-properties-common build-essential git symlinks expect

    # Install build dependancies
    RUN apt-get purge binutils-arm-none-eabi \
    gcc-arm-none-eabi \
    gdb-arm-none-eabi \
    libnewlib-arm-none-eabi
    RUN add-apt-repository -y ppa:team-gcc-arm-embedded/ppa
    RUN apt-get update -q
    RUN apt-cache policy gcc-arm-none-eabi
    RUN apt-get install --no-install-recommends -y gcc-arm-embedded

    #install Debugging dependancies
    #install OPENOCD Build dependancies and gdb
    RUN apt-get install --no-install-recommends -y \
    libhidapi-hidraw0 \
    libusb-0.1-4 \
    libusb-1.0-0 \
    libhidapi-dev \
    libusb-1.0-0-dev \
    libusb-dev \
    libtool \
    make \
    automake \
    pkg-config \
    autoconf \
    texinfo
    #build and install OPENOCD from repository
    RUN cd /usr/src/ \
    &amp;amp;&amp;amp; git clone --depth 1 https://github.com/ntfreak/openocd.git \
    &amp;amp;&amp;amp; cd openocd \
    &amp;amp;&amp;amp; ./bootstrap \
    &amp;amp;&amp;amp; ./configure --enable-stlink --enable-jlink --enable-ftdi --enable-cmsis-dap \
    &amp;amp;&amp;amp; make -j"$(nproc)" \
    &amp;amp;&amp;amp; make install
    #remove unneeded directories
    RUN cd ..
    RUN rm -rf /usr/src/openocd \
    &amp;amp;&amp;amp; rm -rf /var/lib/apt/lists/
    #OpenOCD talks to the chip through USB, so we need to grant our account access to the FTDI.
    RUN cp /usr/local/share/openocd/contrib/60-openocd.rules /etc/udev/rules.d/60-openocd.rules

    #create a directory for our project &amp;amp; setup a shared workfolder between the host and docker container
    RUN mkdir -p /usr/src/app
    VOLUME ["/usr/src/app"]
    WORKDIR /usr/src/app
    RUN cd /usr/src/app

    EXPOSE 4444

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A Dockerfile is a set of instructions to build and create an image. After each instruction the docker build commits a new layer. If a layer hasn’t changed, it doesn’t need to be rebuilt the next time the build runs. Instead, the cached layers are used. This layering system is one of the reasons why Docker is so fast.&lt;br&gt;
Let’s go through a brief overview of the instructions used in this Dockerfile:&lt;br&gt;
 -FROM tells the Docker with which image to start. All Docker images need to have one root image. In this case it is the official ubuntu image.&lt;br&gt;
 -WORKDIR sets the current working directory for subsequent instructions.&lt;br&gt;
 -RUN starts arbitrary commands during the build process. so the processes is for downloading and installing GCC for arm and GDB to debug our application and finaly openocd as a GDB server.&lt;br&gt;
 -VOLUME adds files from the host file system into the Docker container.&lt;br&gt;
Note that there are several instructions. The reason for this are the different layers.&lt;br&gt;
 -ARG sets environment variables. for build-time customization&lt;br&gt;
 -EXPOSE exposes PORTS from the container.&lt;/p&gt;
&lt;h4&gt;
  
  
  Build Docker image:
&lt;/h4&gt;

&lt;p&gt;With the instructions ready all that remains is to run the â€˜docker build’ command, Go to the directory that has your Docker file and run our famous command. after that set the name of our image with â€˜-t’ parameter.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ docker build -t docker-arm .
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwhupne65e5ohqp8c7an0.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwhupne65e5ohqp8c7an0.gif" alt="docker build" width="672" height="377"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;the image will now be listed by docker:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ docker images
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi53yjgc52580ilsqa3w5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi53yjgc52580ilsqa3w5.png" alt="docker images" width="682" height="359"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Run Docker container:
&lt;/h4&gt;

&lt;p&gt;Running your image with â€˜-it’ gives you a running shell inside the container. using -v “volume” will make the directory /usr/src/app inside the container live outside the Union File System and directly accessible on the folder “app” on our host and also to have access to our usb device with root privileges. the -p flag redirects a public port to a private port inside the container. Run the image you previously built:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    $ docker run -it --name docker-arm -p 4444:4444 -v "$(pwd)/app":/usr/src/app --privileged -v /dev/bus/usb:/dev/bus/usb docker-arm /bin/bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu6au1y6umuxnpr538lmb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu6au1y6umuxnpr538lmb.png" alt="docker run" width="681" height="360"&gt;&lt;/a&gt;&lt;br&gt;
after that we will have access to our container using bash&lt;br&gt;
to Print the output of your container:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ docker ps -a
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6c0inzbcpd9258hfq9qa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6c0inzbcpd9258hfq9qa.png" alt="docker ps" width="682" height="359"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Deploy our Project and run it inside Docker Container:
&lt;/h4&gt;

&lt;p&gt;For testing our environment, I created a blink led project for stm32f407vg6, you can clone the project from the Github Repo and paste the content of app folder into your workspace where your Dockerfile is located. you will end up with a directory structure similar to the one bolow :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    $ tree -L 3
    .
    â”œâ”€â”€ app
    â”‚   â”œâ”€â”€ blinky
    â”‚   â”‚   â”œâ”€â”€ main.c
    â”‚   â”‚   â”œâ”€â”€ Makefile
    â”‚   â”‚   â”œâ”€â”€ stm32f4xx_conf.h
    â”‚   â”‚   â”œâ”€â”€ stm32_flash.ld
    â”‚   â”‚   â””â”€â”€ system_stm32f4xx.c
    â”‚   â””â”€â”€ STM32F4-Discovery_FW_V1.1.0
    â”‚   â”œâ”€â”€ _htmresc
    â”‚   â”œâ”€â”€ Libraries
    â”‚   â”œâ”€â”€ MCD-ST Liberty SW License Agreement 20Jul2011 v0.1.pdf
    â”‚   â”œâ”€â”€ Project
    â”‚   â”œâ”€â”€ Release_Notes.html
    â”‚   â””â”€â”€ Utilities
    â”œâ”€â”€ Dockerfile
    â””â”€â”€ README.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So after that we need to compile our project using gcc for arm :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ cd blinky
$ make
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffw4om3o4yvckczko80nr.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffw4om3o4yvckczko80nr.gif" alt="docker deploy project" width="672" height="361"&gt;&lt;/a&gt;&lt;br&gt;
Then, we will found that there are a new files : “main.elf,main.bin and main.hex”&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ ls
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvedg1hilygybmaq45rdg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvedg1hilygybmaq45rdg.png" alt="ls" width="681" height="205"&gt;&lt;/a&gt;&lt;br&gt;
after compiling our project, let’s flash it into the Board with openocd using :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; $ openocd -s "/usr/local/share/openocd/scripts" -f "interface/stlink-v2.cfg" -f "target/stm32f4x.cfg" -c "program blinky.elf verify reset exit")
```


##Conclusion
as you can see, it’s really easy to configure an embedded system project using docker, we only need a Docker file in order to configure our environment.

with our new project we are ready to start developing Applications .

see you next time.
#If you enjoyed reading, please support my work by hitting that little heart!

[FYI: this article originally appeared on my website.](http://nodeit.azurewebsites.net/using-docker-embedded-systems-development/)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>docker</category>
      <category>hardware</category>
      <category>productivity</category>
      <category>linux</category>
    </item>
  </channel>
</rss>
