Translate

14 tháng 4, 2020

[100daysTIL] Day 4 - About C Embedded Language

Logo của group DÂN KỸ THUẬT
Cách đây vài năm, mình có tham gia một group rất hay trên facebook có tên là DÂN KỸ THUẬT. Mục tiêu của mình khi tham gia group này là để nâng cao kiến thức, kỹ năng cũng như học hỏi thêm những điều mới lạ từ các vị tiền bối đi trước. Và may mắn thay, ở đây mình đã tìm được một cuốn sách thật hay về lập trình nhúng. Và mình quý nó như là báu vật vậy, nên bạn bè thân thích gì là mình chia sẻ hết cả. Cuốn sách có tựa đề là "Lập trình nhúng: Chuyện chưa kể" của tác giả Nguyễn Thành Công, xuất bản ngày 15 tháng 7 năm 2018. Hôm nay mình sẽ nói về cuốn sách này, và những điều mình đã học được từ nội dung của cuốn sách. 
Đầu tiên là văn phong của cuốn sách thật sự gần gũi và thân thuộc với độc giả, phù hợp với những cậu sinh viên mới vào nghề như mình. Lối viết dí dỏm và lôi cuốn, thú vị lắm các bạn ạ ^^ Trước hết là khái niệm lập trình nhúng, nghe qua thì có vẻ xa xôi và lạ hoắc nhưng bản chất của nó thì chỉ có một: 
Lập trình nhúng là việc viết các chương chình điều khiển phần cứng, bạn vừa phải biết lập trình, lại vừa phải giỏi về phần cứng. 
Đó là điều kiện cần và đủ để bắt đầu với cái nghề này :v Ngoài ra, trong lập trình nhúng có rất nhiều ngôn ngữ khác nhau như: C, C++, Java và thậm chí có cả Python nữa. Nhưng ngôn ngữ C thì có khả năng tương tác mạnh hơn cả, và nó cũng cung cấp những giải pháp tối ưu về tốc độ cho các ứng dụng nhúng. Hơn nữa C cũng là ngôn ngữ mà tác giả đề cập trong nội dung cuốn sách này. Về cú pháp của C thì nó quanh đi quẩn lại chỉ là khai báo biến, rồi mấy vòng lặp for, while hoặc rẽ nhánh if, else chẳng hạn, nhưng kỹ năng sử dụng C để giải quyết một vấn đề thì cần nhiều bài tập để trau dồi. Giống như tác giả đã nói: 
Bạn không thể đọc sách học bơi là biết bơi, không thể đọc kiếm phổ là thành cao thủ.

 Ngôn ngữ C trong lập trình nhúng

1) Cơ bản về chương trình
Ý nghĩa của việc lập trình là chỉ cho cái máy biết, bạn muốn nó làm cái gì. Để hiểu một chương trình hoạt động ra sao, có 3 thứ mà bạn cần đặc biệt lưu tâm đó là ROM, RAM và CPU. Còn một khái niệm nữa không kém phần quan trọng đó là trình biên dịch, đây là nơi bạn viết và thực thi các dòng lệnh của mình bằng một ngôn ngữ lập trình nhất định. Trình biên dịch sẽ chuyển các dòng lệnh (người hiểu được) sang ngôn ngữ máy (máy hiểu được), và nạp vào ROM. Khi khởi chạy chương trình, CPU sẽ đọc các dữ liệu được lưu trong ROM và thực thi. ROM giống như ông trùm vậy, ra lệnh thế nào thì CPU phải làm thế đó và không được cãi lời. Còn RAM là bộ nhớ được sử dụng để thực hiện chương trình, nên phải đọc và ghi liên tục. CPU được toàn quyền sử dụng bộ nhớ này, giống như việc CPU là trưởng phòng thì RAM là nhân viên ý. 

Tóm lại: 
- ROM (Read only memory): Bộ nhớ chỉ cho phép đọc, khi mất điện dữ liệu vẫn còn đó.
- RAM (Random access memory): Bộ nhớ truy cập ngẫu nhiên, khi mất điện dữ liệu bị xóa hoàn toàn.
- CPU (Control processing unit): Là bộ xử lý chung tâm, chịu trách nhiệm thực thi chương trình.

2) Cách tổ chức bộ nhớ
Thông thường thì đơn vị nhỏ nhất của bộ nhớ là Byte (hay còn gọi là 1 ô nhớ), và ứng với mỗi byte sẽ có một địa chỉ riêng biệt. Mỗi ô nhớ sẽ có 2 thông số mà chúng ta cần quan tâm đó là:  
- Địa chỉ (nó ở đâu, địa chỉ có thể là số 8-bit, 16-bit, 32-bit...)
- Giá trị được lưu (là bao nhiêu, chỉ là số 8-bit (1 byte) thôi)
Dữ liệu trong bộ nhớ

3) Khai báo biến
Các kiểu biến thông thường khi lập trình C là char, int, long, float, double. Nhưng trong lập trình nhúng, tài nguyên bộ nhớ hạn chế nên việc bạn biết các biến chiếm bao nhiêu ô nhớ là điều rất quan trọng. Thông thường, các biến được khai báo dưới dạng uint8_t, int8_t, uint16_t, int16_t... để sử dụng thì bạn cần #include <stdin.h>. Một điểm đặc biệt nữa là kiểu uint8_t thường được dùng để đại diện cho một ô nhớ (8-bit), uint16_t sẽ yêu cầu bộ nhớ cấp 2 ô nhớ liền kề (16 bits), . . . Hãy thường sử dụng các kiểu dữ liệu với bộ nhớ tường minh trên để kiểm soát bộ nhớ chặt chẽ hơn nhé.

4) Kiểu dữ liệu tự định nghĩa (typedef)
Ngôn ngữ C cung cấp cơ chế tự định nghĩa kiểu dữ liệu để việc truy xuất dữ liệu được thuận tiện. Chúng ta sẽ cùng nhau xem xét ví dụ sau để hiểu hơn về vấn đề này nhé :v
typedef struct { 
  int8_t   temp; 
  uint8_t  humi; 
  uint16_t lux ; 
}env_t
Khi bạn tự định nghĩa một kiểu dữ liệu như trên, thực chất là bạn đang tương tác với một vùng nhớ cho trước. Nếu bạn khai báo một biến env_t evn; thì ngay lập tức, nó sẽ cung cấp cho bạn 4 ô nhớ liền nhau. Nếu bạn in địa chỉ của biến evn ra nó sẽ hiển thị địa chỉ ô nhớ đầu tiên của dãy 4 ô nhớ đó. Và kiểu env_t sẽ cho máy tính biết cách truy cập tới 4 ô nhớ đó như thế nào.
Truy cập biến kiểu evn_t
Một điểm cần lưu ý là các máy tính thường có cơ chế làm tròn biên kiểu dữ liệu (data structure alignment). Nếu chúng ta khai báo như sau:
typedef struct { 
  int8_t   temp;
  uint16_t lux ; 
  uint8_t  humi; 
}env_t
Biến lux khai báo ở giữa, thì kiểu dữ liệu env_t giờ đây có độ dài là 6 byte chứ không phải 4!!!. Lúc này cấu trúc của kiểu biến env_t sẽ có dạng như sau:
Truy cập biến kiểu evn_t
Hai ô nhớ tên padding được thêm vào để tăng hiệu suất việc đọc ghi dữ liệu trong máy tính hiện đại. Nếu các bạn quan tâm thì có thể tìm hiểu sâu hơn nhé.

5) Con trỏ
Có thể nói con trỏ là công cụ lợi hại nhất của C, bạn khó mà giỏi C nếu bỏ qua con trỏ được. Bản chất của con trỏ (chưa nói đến con trỏ hàm) là trỏ tới một vùng nhớ nào đó và tương tác với vùng nhớ đó. Một con trỏ cần 2 thông tin sau để có thể hoạt động được: địa chỉkiểu dữ liệu nó sẽ trỏ tới. 2 yếu tố trên giúp bạn có thể đi đến vùng nhớ mà bạn quan tâm sau đó có thể truy cập vùng nhớ đó theo cách bạn muốn. Một lưu ý nữa là ngôn ngữ C đồng nhất giữa mảng và con trỏ. Ví dụ mình khai báo mảng: uint32_t arr[4]; Lúc này ta sẽ có arr là địa chỉ của phần tử đầu tiên của mảng, hay arr = &arr[0] (cùng 1 địa chỉ),  *arr = arr[0] (cùng 1 giá trị).

Trên đây là một số tóm lược của mình về nội dung cuốn sách, cảm ơn các bạn đã đón đọc.

13 tháng 4, 2020

[100daysTIL] Day 3 - About Confidential and Web5ngay

Thật sự thì mình không định đem chủ đề tâm sự vào những bài viết thế này, nhưng những kiến thức mà mình thu nhặt được trong ngày hôm nay lại chỉ vỏn vẹn có nhiêu đây thôi. Mặc dù mình đã dậy sớm, đã đau đầu tìm đi tìm lại những kiến thức liên quan tới V2X communication nhưng mà mới tệ làm sao, mình không tài nào hiểu nổi. Mà đã không hiểu rồi thì làm sao mình có thể nói về nó được đây? Vậy là mình đã quyết định sẽ đưa chủ đề này vào bài viết, một trong những điều mình rất thích và rất đam mê đó là tìm hiểu về cảm xúc của con người.
Trước đây đã từng có thời gian mình dự định sẽ thi vào khoa tâm lý của trường đại học quốc gia Hà Nội, nhưng rồi những rào cản về điểm số môn văn đã giúp mình nhận ra. Khả năng chém gió của mình tệ quá, nên cái nghề này có lẽ không phải dành cho mình rồi. Cho tới tận bây giờ, phần lớn thời gian mình vẫn dành cho việc suy ngẫm về thế giới và về cuộc đời, mặc dù là như vậy nhưng đa số những suy nghĩ của mình đều dẫn tới lối mòn của sự bế tắc và bi lụy. Vậy nên những người bạn đã từng nghe qua lời tâm sự của mình đều cảm nhận được một màu u tối đang chiếm lấy lối suy nghĩ của mình. Thế rồi mình quyết định sẽ thay đổi bản thân một chút, và mình bắt đầu lên mạng kiếm tìm những bất cứ thứ thông tin gì liên quan đến hai từ "tâm sự". Và thật tình cờ làm sao mình bắt gặp chương trình này: TÂM SỰ KINH DOANH của Web5ngày. 
Đối với mình mà nói thì chương trình này có khác nào một vị cứu tinh đâu. Vừa là người bạn tâm tình mỗi khi lối sống của mình đi vào bế tắc, vừa như người cha dành hết sự chân thành, ấm áp vào từng lời nói mong cho đứa con của mình được khôn lớn nên người. Có lẽ nhiều người cũng cảm nhận được sự chân thành ấy nên đều gọi người với cái tên ấm áp là "thầy 5". Thiết nghĩ sở dĩ mọi người gọi vậy bởi vì nghề giáo là một nghề cao quý nhất trong tất cả những nghề cao quý, những người cô, người thầy luôn ở phía sau âm thầm đóng công, góp sức cho thành tựu của mỗi con người. Bởi vì từ nhỏ tới lớn chúng ta đến trường, họ đều dạy ta những điều hay lẽ phải, những chân lý, định lý; rồi cả cách cảm thụ cuộc sống thông qua những bài phân tích về văn học, nghệ thuật, . . . Kể ra thì nhiều nhưng mãi tới tận sau này mình mới hiểu, mình của ngày hôm nay đã học được bao điều từ những người thầy phía trước. Kể về họ với sự biết ơn đơn thuần thì có lẽ không bao giờ là đủ, nên thôi mình xin phép được khép lại lời giới thiệu sơ sài về những người thầy ở đây. 
Quay trở lại với chương trình TÂM SỰ KINH DOANH của Thầy 5, tiếp theo đây là một vài điều đã giúp trang hoàng lại tâm hồn cũ kỹ của mình.

1) Chuyện bao đồng - Số thứ 65

Nguồn: Trang web Tâm sự kinh doanh
Đây là bản audio đầu tiên mà mình nghe, và nó để lại ấn tượng thật sự sâu sắc về thế giới quan của mình. Điều đầu tiên mà thầy 5 nhắc tới trong bài tâm sự này, là "xin phép các bạn cho tôi được nói chuyện bao đồng". Một câu nói thôi, nhưng nó thể hiện được tính cách con người, thầy là người ý thức rất rõ về những điều mình đã, đang và sẽ nói. Chuyện bao đồng là một chủ đề nhạy cảm với cả người nói lẫn người nghe nên thầy mới dùng hai từ "xin phép". Nội dung của audio này xoay quanh một thứ văn hóa gọi là phán xét: "Cuộc đời này chúng ta chỉ nên góp ý thôi, hạn chế chê. Thực ra chê được nhưng khi muốn chê hoặc phê phán người khác thì điều đầu tiên là bạn phải có một tư cách để chê." Chính những câu nói của thầy đã chạm vào chút tự tôn còn sót lại mình dành cho bản thân, thế là mình bắt đầu ngồi và suy nghĩ. Đúng thật, nhìn ra đời mình chẳng bằng ai cả nên là thôi lui về, từ đó mình không dám chê bai bất kỳ ai nữa. Thực ra thì mình vẫn thích đi khịa đều đều :v Nhưng mà chê bai để động chạm vào lòng tự ái của người ta thì khác nhé :'>

2) Đừng chờ - Số thứ 81

Nguồn: Trang web Tâm sự kinh doanh
Sau khi nghe bản audio này mình thật sự đã thấy được rằng bản thân đang hiểu sai bản chất vấn đề một cách trầm trọng ra sao. Mình sẽ kể cho các bạn nghe lý do nhé :'> Chắc hẳn các bạn ai cũng đều nghe về câu chuyện rùa và thỏ tham ra một cuộc chạy đua trong rừng rồi phải không. Kết thúc của câu chuyện này thì chúng ta đều biết rằng rùa đã thắng, vì thỏ cậy mình nhanh nhẹn nên thường ham vui giữa đường mà quên mất việc đang tham gia cuộc đua. Ban đầu khi nghe câu chuyện này mình chỉ nghĩ tới bài học là, nếu làm việc sao nhãng thì thành quả sẽ không tìm tới chúng ta đâu. Nhưng sau khi nghe thầy 5 phân tích, mình lại thấy một khía cạnh khác của vấn đề. Xuất phát điểm của chúng ta chẳng có gì cả, giống như chú rùa kia vậy. Nếu cũng là người sẽ đi lên từ hai bàn tay trắng thì hơn ai hết bạn sẽ hiểu được rằng, tất cả những gì có thể giúp chúng ta về đích chính là sự tập trung vào một mục tiêu, cố gắng, nỗ lực không ngừng nghỉ để theo đuổi mục tiêu ấy. Cuộc sống luôn cho chúng ta những thử thách không dễ dàng, giống như việc phải chạy đua với loài thỏ vậy, rõ ràng về tốc độ chúng ta không thể so sánh với họ. Nhưng nếu may mắn gặp được một chú thỏ thích sao nhãng, còn chúng ta vẫn lầm lũi làm và tiến về phía trước thì kết quả sẽ khác. Kỳ tích sẽ xuất hiện và bạn sẽ có một câu chuyện để đời đấy :'> Nếu coi cuộc đua này là hành trình của cuộc đời, thì tất cả những gì mình có thể là lầm lũi mà đi thôi. Và phải tin tưởng một điều rằng nếu sinh ra là con rùa, bạn vẫn thắng được như thường, vì trường đua của cuộc đời nó dài lắm đấy :'>

Thực ra thì vẫn còn nhiều điều mình học được từ chương trình này của thầy 5, nhưng do giờ cũng đã muộn rồi, nên mình xin phép phải đi ngủ thôi :v