5-tips-for-versioning-embedded-systems

One topic that can be tricky for embedded systems engineers is how to version their embedded system. Every embedded system has two primary systems that need to be versioned, the hardware and the software. While versioning the system sounds simple, it can be confusing on the best way to version the system. In this post, we will examine five tips for versioning your embedded system.

version control, embedded systems, software and hardware, Major.Minor.Patch Semantic

While versioning the system sounds simple, it can be confusing finding the best way to version the system. (Image source: New Electronics)

Tips #1 – Use GPIO to Hard Code PCB Versions

Putting the hardware version number on the PCB silkscreen is a common way to version hardware for an embedded system, but the system software can’t read the silkscreen. In some applications, the hardware can change considerably between versions and it can be critical to ensure that a certain software version runs on specific hardware. To accomplish this, the software needs to be able to read the hardware version number to make sure that it is running on compatible hardware.

There are two ways that developers can version their hardware so that software can read the hardware version. First, if the system has spare GPIO, two or three GPIO lines can be dedicated to indicating the hardware version. Each GPIO line can be either pulled to VCC (represents a 1) or ground (represents a 0). If a binary representation is used, two GPIO would provide up to four versions while three GPIO would provide eight versions as shown below:

Version

GPIO 0

GPIO 1

GPIO 2

Version 1

Version 2

1

Version 3

1

Version 4

1

1

Version 5

1

Version 6

1

1

Version 7

1

1

Version 8

1

1

1

Not all systems will have two or three free GPIO lines available. Instead, developers could also leverage a free analog to digital (ADC) channel and use an analog voltage to represent the version number. In this case, a single ADC channel could be connected to the mid-point of a resistor bridge with one resistor connected to VCC and the other to ground. In this situation, the resistor values would be adjusted to provide a specific voltage that is associated with a version number. For low power applications, developers would want to choose resistance values that are sufficiently large enough to prevent any large parasitic current draw through the circuit.

Tip #2 – Use the Major.Minor.Patch Semantic

There are quite a few different methods that developers can use to version their embedded software. The system that should be adopted though, and fits with what most software development teams use is the MAJOR.MINOR.PATCH semantics. You’ve undoubtedly seen software with these version numbers such as 1.0.0, 1.1.2, 2.4.2, and so on.

The general versioning scheme, and understanding the changes impacts, can be easily seen at a glance because of the semantics definitions. For example, the MAJOR number only increments when the software is released with incompatible API changes. This means that we only increment MAJOR if there are changes to the code that are not backwards compatible. The MINOR number is only incremented when improvements are made that are backwards compatible with the existing API’s. PATCH is only incremented when bug fixes are applied to the software.

Using this semantic pattern for versioning will make it so that any software developer can understand the versioning.

Tip #3 – Create a version.h module

I’ve generally found that creating a version.h module that contains the Major.Minor.Patch semantics along with a version log to be the most effective software versioning method. The version number can be easily set for the software using macro definitions such as:

#define VERSION_MAJOR      (1)

#define VERSION_MINOR      (0)

#define VERSION_PATCH       (0)

A developer could even set the minimum hardware version allowed to run the software:

#define HARDWARE_VERSION_MIN  (4)

An important piece of the version.h module is not just to version the software but to also include the version log. This can be done using comments and should include information such as:

  • Software version
  • Module changed
  • Changes to module

In my own version logs, I always append the changes to the top of the log so that I don’t have to scroll all the way to the bottom to see what changes were made in a previous version.

Tip #4 – Avoid module and function versioning if possible

The way that an embedded application is versioned is completely up to the development team, but one recommendation I have is to try to avoid module and function level versioning if possible. What I mean by this is that we don’t want to be assigning version numbers to individual C modules or the functions within them. The reason for this is that it starts to add an unnecessary overhead to versioning that also improves the likelihood that the versioning information will be wrong.

For example, if I have a Dio_Write function that I’ve made changes to, I don’t want to increment the version number for this function. I want to update the version number for the component that Dio_Write is in. This could be Dio.c or it could be a driver component that is a collection of the drivers for a specific microcontroller. If I version the function, I also have to version the module, and the component and the software. I’m going to forget to update it somewhere and then those changes are going to get lost. It’s best to just avoid versioning at such a low-level.

Tip #5 – Integrate VCS with your IDE

An important aspect to versioning software is how that software is integrated into a version control system (VCS). The most popular VCS these days is git, but svn and mecurial are still used by some development teams. When versioning software, I’ve found that it’s critical to make sure that you integrate your VCS functionality into your development environment in order to making committing changes simple and easy. For example, many VCS plug-ins will allow a developer to click a single button and they will add any new changes to the push. They’ll also pop up a dialog that gives a developer a chance to comment on the changes they’ve made. This is the perfect opportunity to copy the changes that were logged in version.h and paste them into the VCS log. That way all the version information between the software and the VCS match!

Conclusions

Versioning an embedded system doesn’t have to be complicated. In fact, the simpler you make versioning your system, the smaller the chances will be that there will be confusion or issues from using the wrong version of hardware or software. As we have seen, there are several tricks developers can leverage to simplify versioning such as using an integrated version log and hardware-based versioning. No matter what system is adopted, the only way it will be successful is if the developers involved adopt a disciplined approach to versioning and don’t cut corners when they commit their software.

Jacob Beningo is an embedded software consultant who currently works with clients in more than a dozen countries to dramatically transform their businesses by improving product quality, cost and time to market. He has published more than 200 articles on embedded software development techniques, is a sought-after speaker and technical trainer, and holds three degrees which include a Masters of Engineering from the University of Michigan. Feel free to contact him at [email protected], at his website, and sign-up for his monthly Embedded Bytes Newsletter

181 comments

  1. Fantastic beat ! I wish to apprentice whilst you amend your
    web site, how could i subscribe for a blog web site? The account aided me a appropriate deal.
    I were a little bit familiar of this your broadcast offered bright clear
    idea

  2. I’m amazed, I have to admit. Rarely do I encounter a blog that’s equally educative and engaging, and let
    me tell you, you have hit the nail on the head.
    The problem is an issue that too few folks are speaking intelligently about.
    I am very happy I found this in my hunt for something concerning
    this.

  3. Greetings I am so thrilled I found your blog, I really found
    you by accident, while I was researching on Yahoo for something else, Anyhow I am here now and would just like to
    say thank you for a fantastic post and a all round interesting blog (I also love the theme/design), I don’t have time to read it all at the minute but I have book-marked it and also added your
    RSS feeds, so when I have time I will be back to read a lot more, Please do keep up
    the fantastic b.

  4. When I originally commented I clicked the “Notify me when new comments are added” checkbox and now each time a comment is added I get three emails with the same comment.
    Is there any way you can remove people from that service?
    Thank you!

  5. Do you mind if I quote a few of your articles as long as I
    provide credit and sources back to your site?

    My blog is in the very same niche as yours and
    my users would genuinely benefit from a lot of the
    information you present here. Please let me know if this alright with you.
    Thanks!

  6. May I simply just say what a relief to find someone who really understands
    what they are discussing on the internet. You definitely
    realize how to bring an issue to light and make it important.
    A lot more people should check this out and understand this side of
    the story. I was surprised that you’re not more
    popular given that you most certainly have the gift.

  7. You can definitely see your enthusiasm within the
    article you write. The world hopes for more passionate writers such as you who aren’t afraid
    to mention how they believe. At all times go after your
    heart.

  8. Heya i am for the first time here. I found this board and I find It truly useful & it helped me out much.
    I hope to give something back and aid others like you aided me.

  9. Its like you read my mind! You appear to know
    so much about this, like you wrote the book in it or something.
    I think that you can do with a few pics to drive the message home a little
    bit, but instead of that, this is excellent blog. An excellent read.
    I will definitely be back.

  10. Its like you read my mind! You seem to know so much about this, like you wrote the book in it or something.
    I think that you could do with a few pics to
    drive the message home a bit, but instead of that, this is great blog.
    A great read. I will certainly be back.

  11. Do you have a spam issue on this blog; I also am a blogger, and I was
    wondering your situation; we have created some nice procedures and we are looking to exchange methods with other folks, please shoot me an email if interested.

  12. Hello! I’m at work browsing your blog from my new iphone
    4! Just wanted to say I love reading your blog and look forward
    to all your posts! Keep up the great work!

  13. I am really impressed along with your writing skills as smartly as with the structure to your blog.
    Is this a paid topic or did you modify it your self? Either way keep up the excellent quality writing, it is rare to peer a great weblog
    like this one today..

  14. Woah! I’m really digging the template/theme of this site.
    It’s simple, yet effective. A lot of times it’s tough to get that “perfect balance” between usability and visual appearance.
    I must say you have done a great job with this.
    In addition, the blog loads extremely quick for me on Firefox.

    Excellent Blog!

  15. hello there and thank you for your info – I’ve definitely
    picked up something new from right here. I did however expertise a few
    technical issues using this site, as I experienced to reload the web site a lot of times previous
    to I could get it to load correctly. I had been wondering
    if your hosting is OK? Not that I’m complaining, but slow loading instances times will very
    frequently affect your placement in google and could damage your quality score
    if advertising and marketing with Adwords. Anyway I’m adding this
    RSS to my email and could look out for a lot more of your respective exciting content.
    Make sure you update this again very soon.

  16. Hey! I know this is kind of off topic but I was wondering which
    blog platform are you using for this site? I’m getting fed up
    of WordPress because I’ve had issues with hackers and I’m looking at options for another platform.

    I would be great if you could point me in the direction of a good platform.

  17. Undeniably consider that that you said. Your favorite justification appeared to be at
    the web the easiest factor to take into accout of. I say
    to you, I certainly get annoyed whilst people think about issues that they plainly don’t realize
    about. You controlled to hit the nail upon the highest and outlined out the
    whole thing without having side effect , other people can take a signal.
    Will likely be again to get more. Thank you

  18. I was wondering if you ever thought of changing the layout of your website?
    Its very well written; I love what youve got to say.
    But maybe you could a little more in the way of content so people could connect with
    it better. Youve got an awful lot of text for only having one or
    2 images. Maybe you could space it out better?

  19. Hi my friend! I want to say that this post is amazing, nice written and include almost all important infos.
    I would like to peer extra posts like this .

  20. Howdy! This post could not be written any better! Reading through this post reminds me of my good old room mate!
    He always kept chatting about this. I will forward this post to him.
    Fairly certain he will have a good read. Thanks for sharing!

  21. Hi, Neat post. There’s a problem with your site in internet explorer,
    could check this? IE still is the market chief and a large section of folks will omit your excellent writing because of this problem.

  22. First of all I want to say fantastic blog!
    I had a quick question which I’d like to ask if you don’t mind.
    I was curious to find out how you center yourself and
    clear your mind prior to writing. I have had a tough time
    clearing my mind in getting my ideas out there.
    I truly do take pleasure in writing but it just seems like the
    first 10 to 15 minutes are wasted just trying to figure out how
    to begin. Any ideas or tips? Thank you!

  23. I love your blog.. very nice colors & theme.
    Did you create this website yourself or did you hire someone to do it for
    you? Plz answer back as I’m looking to design my own blog and would like to know where u got
    this from. thanks

  24. I was suggested this blog by my cousin. I’m not sure whether this post is written by him as no
    one else know such detailed about my difficulty. You’re incredible!
    Thanks!

  25. Hey very cool site!! Guy .. Beautiful .. Superb ..

    I’ll bookmark your website and take the feeds also?
    I’m glad to find numerous useful information here within the publish, we’d like work
    out extra techniques on this regard, thank you for sharing.
    . . . . .

  26. I love your blog.. very nice colors & theme. Did you make this website yourself or did you hire someone to do it for you?

    Plz answer back as I’m looking to design my own blog and would
    like to know where u got this from. many thanks

  27. Admiring the dedication you put into your site and in depth information you present.
    It’s great to come across a blog every once in a while that isn’t the same old rehashed information. Fantastic read!
    I’ve bookmarked your site and I’m adding your RSS feeds to my
    Google account.

  28. Hi fantastic website! Does running a blog like this require a
    large amount of work? I’ve virtually no knowledge of computer programming however I was hoping to start my own blog in the near future.
    Anyway, if you have any suggestions or techniques for new blog owners please share.
    I understand this is off topic but I simply had to ask.
    Thanks a lot!

  29. Hey there! Do you know if they make any plugins
    to protect against hackers? I’m kinda paranoid about losing everything I’ve worked hard on. Any suggestions?

  30. This is very interesting, You are a very skilled blogger.

    I’ve joined your rss feed and look forward to seeking more
    of your fantastic post. Also, I have shared your web site in my social networks!

  31. It’s really a cool and useful piece of info. I am satisfied that you just
    shared this helpful information with us. Please stay us informed like this.
    Thank you for sharing.

  32. Hello my family member! I wish to say that this article is
    amazing, nice written and include almost all
    vital infos. I would like to see more posts like this .

  33. I’m curious to find out what blog system you have been working with?
    I’m experiencing some minor security issues with my latest site and
    I would like to find something more safe. Do you have any suggestions?

  34. Have you ever considered writing an e-book or guest authoring on other sites?
    I have a blog based on the same information you discuss and would love to have
    you share some stories/information. I know my visitors
    would appreciate your work. If you’re even remotely interested, feel free to shoot me an e mail.

  35. You actually make it seem so easy with your presentation but I find this matter to be really something that I think I would never understand.
    It seems too complicated and very broad for me. I’m looking forward for
    your next post, I’ll try to get the hang of it!

  36. Hello There. I found your blog using msn. This is a very well written article.
    I’ll make sure to bookmark it and return to read more of your useful
    info. Thanks for the post. I’ll definitely return.

  37. Woah! I’m really loving the template/theme of this blog.
    It’s simple, yet effective. A lot of times it’s challenging to get that “perfect balance” between user friendliness and visual appearance.
    I must say that you’ve done a fantastic job with this.

    Additionally, the blog loads very quick for me on Chrome.
    Excellent Blog!

  38. Hey I know this is off topic but I was wondering if you knew of any widgets I could add
    to my blog that automatically tweet my newest twitter updates.
    I’ve been looking for a plug-in like this for quite some time and was hoping maybe you would have some experience with something like
    this. Please let me know if you run into anything.

    I truly enjoy reading your blog and I look forward to your new updates.

  39. Can I simply just say what a comfort to discover
    someone who truly understands what they’re talking about on the net.
    You definitely understand how to bring an issue to light and make it important.
    More people should read this and understand this side of your story.
    I can’t believe you’re not more popular given that
    you definitely possess the gift.

  40. Hello There. I discovered your blog the usage of
    msn. That is a really well written article. I will make sure
    to bookmark it and come back to read extra of your useful info.

    Thank you for the post. I will definitely comeback.

  41. It’s actually a great and helpful piece of info.
    I am satisfied that you just shared this useful information with us.
    Please keep us informed like this. Thank you for sharing.

  42. Undeniably believe that which you said. Your favorite justification seemed
    to be on the web the simplest thing to be aware
    of. I say to you, I definitely get irked while people think about worries that they plainly do not know about.
    You managed to hit the nail upon the top and defined out the
    whole thing without having side-effects , people
    could take a signal. Will probably be back to get more.

    Thanks

  43. Hey There. I discovered your weblog using msn. That is an extremely smartly written article.
    I’ll make sure to bookmark it and come back to learn extra of your useful information. Thanks for
    the post. I’ll certainly return.

  44. Its such as you learn my mind! You seem to grasp a lot approximately
    this, like you wrote the e-book in it or something.

    I believe that you just can do with a few % to power the message home a little bit,
    but other than that, this is wonderful blog. An excellent read.
    I will definitely be back.

  45. I don’t even know how I ended up here, but I thought this post was great.
    I do not know who you are but definitely you are going to a
    famous blogger if you aren’t already 😉 Cheers!

  46. Have you ever thought about creating an e-book or guest
    authoring on other blogs? I have a blog based upon on the same topics you discuss and would love to have you share some stories/information. I know my readers
    would enjoy your work. If you’re even remotely interested, feel
    free to send me an e-mail.

  47. You’re so interesting! I don’t think I’ve truly read through a single thing like that before.

    So great to find someone with original thoughts on this subject matter.
    Seriously.. thanks for starting this up. This website
    is one thing that is required on the web, someone with
    a bit of originality!

  48. I absolutely love your blog and find a lot of
    your post’s to be exactly I’m looking for. Does one offer guest writers to write content for you personally?

    I wouldn’t mind publishing a post or elaborating
    on most of the subjects you write related to here. Again, awesome web log!

  49. I know this if off topic but I’m looking into starting
    my own weblog and was curious what all is needed to get set up?

    I’m assuming having a blog like yours would cost a pretty penny?
    I’m not very internet savvy so I’m not 100% certain. Any recommendations or advice would
    be greatly appreciated. Many thanks

  50. I have been surfing online more than three hours these days, but I never discovered any attention-grabbing
    article like yours. It’s pretty worth sufficient for me.
    In my view, if all web owners and bloggers made good
    content as you probably did, the internet will
    probably be a lot more helpful than ever before.

  51. Attractive element of content. I simply stumbled upon your site and
    in accession capital to claim that I acquire actually loved account your blog posts.

    Any way I will be subscribing to your augment and even I fulfillment
    you get admission to consistently fast.

  52. I am not sure where you’re getting your information, but great topic.
    I needs to spend some time learning more or understanding more.
    Thanks for wonderful info I was looking for this information for my mission.

  53. My spouse and I stumbled over here coming from a different
    web address and thought I should check things out. I like what I see so now
    i’m following you. Look forward to exploring your web page for a
    second time.

  54. Greetings from Idaho! I’m bored at work so I decided to check out
    your website on my iphone during lunch break.
    I love the knowledge you present here and can’t wait to take a look when I get home.

    I’m amazed at how quick your blog loaded on my mobile
    .. I’m not even using WIFI, just 3G .. Anyways, good site!

  55. First of all I would like to say awesome
    blog! I had a quick question in which I’d like to ask if you don’t mind.
    I was interested to know how you center yourself and clear your head prior to writing.
    I have had difficulty clearing my mind in getting
    my thoughts out there. I truly do take pleasure in writing however it just seems like
    the first 10 to 15 minutes are generally lost simply just trying to
    figure out how to begin. Any recommendations or hints? Kudos!

  56. We are a group of volunteers and starting a new scheme in our
    community. Your site provided us with valuable information to work on. You have done an impressive job and our whole community will be grateful to you.

  57. I’m amazed, I must say. Seldom do I encounter a blog that’s both educative and interesting,
    and without a doubt, you have hit the nail on the head.
    The issue is an issue that not enough men and women are speaking intelligently about.

    I am very happy I came across this during my hunt for something relating to this.

  58. I used to be suggested this web site by way of my cousin. I’m now not positive whether or not
    this publish is written by means of him as nobody else realize such distinctive about my trouble.

    You’re incredible! Thanks!

  59. I do not even understand how I ended up right here, but I thought this
    submit was good. I do not understand who you might be but certainly you’re going to a famous blogger when you are not already.
    Cheers!

  60. Thank you for sharing your info. I truly appreciate your efforts and
    I will be waiting for your further post thank you
    once again.

  61. I’m not sure why but this website is loading extremely slow
    for me. Is anyone else having this issue or is it a
    issue on my end? I’ll check back later and see if the problem still exists.

  62. Hmm it appears like your blog ate my first comment (it was super long) so I guess I’ll just sum it
    up what I wrote and say, I’m thoroughly enjoying your blog.
    I as well am an aspiring blog writer but I’m still new
    to everything. Do you have any recommendations for inexperienced blog writers?

    I’d certainly appreciate it.

  63. I am sure this paragraph has touched all the internet people, its really really pleasant piece of writing on building up new webpage.

  64. Simply wish to say your article is as astonishing. The clearness in your post
    is simply cool and i could assume you’re an expert on this subject.
    Fine with your permission allow me to grab your feed
    to keep updated with forthcoming post. Thanks a million and please carry on the
    rewarding work.

    Here is my site; livechat poker pulsa

  65. I am really impressed with your writing skills and also with the layout on your blog.
    Is this a paid theme or did you modify it yourself?

    Anyway keep up the nice quality writing, it’s rare to see a nice blog
    like this one nowadays.

  66. I will immediately snatch your rss feed as I can not to find
    your e-mail subscription link or e-newsletter
    service. Do you have any? Kindly let me realize in order
    that I may just subscribe. Thanks.

  67. Wonderful beat ! I wish to apprentice while you amend your site, how
    can i subscribe for a blog web site? The account helped me a acceptable deal.
    I had been a little bit acquainted of this your broadcast provided bright clear concept

  68. I do not know if it’s just me or if everyone else experiencing issues
    with your blog. It appears like some of the text in your posts are running off the screen. Can someone else please comment and let me know if this is happening
    to them too? This might be a problem with my browser because I’ve had this happen before.
    Cheers

  69. Hello just wanted to give you a brief heads up and let you know a few of
    the pictures aren’t loading properly. I’m not sure why
    but I think its a linking issue. I’ve tried it in two different browsers and both show the same outcome.

  70. Thanks for some other fantastic article. Where else could anyone get that type of information in such an ideal
    means of writing? I’ve a presentation subsequent week, and I am on the look for such info.

  71. Howdy! This article could not be written any better!
    Going through this post reminds me of my previous roommate!
    He continually kept talking about this. I am going to forward this
    information to him. Fairly certain he’s going to have a good read.
    Thank you for sharing!

  72. I loved as much as you’ll receive carried out right here.
    The sketch is tasteful, your authored material stylish.
    nonetheless, you command get bought an edginess over that you wish be
    delivering the following. unwell unquestionably come further formerly again as exactly the same nearly a lot often inside case you shield this increase.

  73. You actually make it appear so easy along with your
    presentation however I find this topic to be really something which I
    think I might by no means understand. It kind of feels too complex and very broad for me.
    I’m looking forward on your next put up, I will attempt to get the dangle of it!

  74. Hello everyone, it’s my first pay a visit at this site, and piece of writing is truly
    fruitful for me, keep up posting such articles or reviews.

  75. Excellent blog here! Also your web site loads up very fast!
    What web host are you using? Can I get your affiliate link to your host?
    I wish my site loaded up as fast as yours lol

  76. Link exchange is nothing else but it is simply placing the
    other person’s webpage link on your page at appropriate place and other person will also do similar in support of you.

  77. What’s up colleagues, how is everything, and what you
    desire to say on the topic of this piece of writing, in my view its in fact remarkable in support
    of me.

  78. Incredible! This blog looks exactly like my old one!
    It’s on a completely different topic but it has pretty much the same page layout and design. Superb choice of colors!

  79. Nice post. I was checking continuously this weblog and I’m impressed!

    Very useful info specifically the last phase 🙂 I maintain such information much.
    I was seeking this certain information for a very lengthy time.
    Thanks and best of luck.

  80. No matter if some one searches for his vital thing,
    thus he/she wants to be available that in detail, so that
    thing is maintained over here.

  81. I know this if off topic but I’m looking into starting my own weblog and
    was wondering what all is required to get set up?
    I’m assuming having a blog like yours would cost a pretty penny?
    I’m not very internet savvy so I’m not 100% certain. Any tips or
    advice would be greatly appreciated. Thank you

  82. I was recommended this website by my cousin. I’m not sure whether this post is written by him as
    nobody else know such detailed about my problem.
    You’re incredible! Thanks!

  83. Thank you for any other fantastic article.

    Where else may anybody get that type of info in such an ideal means
    of writing? I’ve a presentation next week, and I am at
    the look for such info.

  84. Magnificent goods from you, man. I have understand your stuff previous to
    and you’re just too fantastic. I really like what
    you’ve acquired here, certainly like what you are saying and
    the way in which you say it. You make it entertaining and you still care for to keep
    it sensible. I can not wait to read far more
    from you. This is really a tremendous site.

  85. Hello there, just became alert to your blog through Google, and found that it
    is truly informative. I’m going to watch out for brussels.
    I’ll appreciate if you continue this in future.
    Many people will be benefited from your writing. Cheers!

  86. Aw, this was an exceptionally nice post. Finding the time and actual effort to create a
    really good article… but what can I say… I procrastinate a whole
    lot and don’t seem to get nearly anything done.

  87. I every time used to study post in news papers but now as I am
    a user of web so from now I am using net for articles or reviews,
    thanks to web.

  88. Magnificent goods from you, man. I’ve be mindful your stuff
    prior to and you are just too fantastic. I actually like what you’ve received here,
    certainly like what you are stating and the best way
    by which you assert it. You’re making it entertaining and you continue to care for to stay it smart.
    I cant wait to learn much more from you. This is really a great website.

  89. Ahaa, its fastidious discussion on the topic of this piece
    of writing here at this weblog, I have read all that, so now me also commenting here.

  90. Thanks on your marvelous posting! I truly enjoyed reading it, you will be a
    great author. I will remember to bookmark your blog and will often come back in the future.
    I want to encourage you to continue your great
    posts, have a nice holiday weekend!

  91. Howdy! Someone in my Facebook group shared this site with us so I
    came to give it a look. I’m definitely loving the
    information. I’m bookmarking and will be tweeting this to my followers!
    Fantastic blog and great design and style.

Leave a Reply

Your email address will not be published.