- VisualStudio2022
- pprof-Hướng dẫn sử dụng nó trong bản mạng trực tiếp
- Triển khai C# các loại hộp chọn nhiều màu lựa chọn thả xuống, cây lựa chọn nhiều màu lựa chọn thả xuống và các nút tối đa
- [Ghi chú học tập] Cơ sở dữ liệu cấu trúc: cat tree
Xin chào mọi người, tôi là Pi Ziheng, một kẻ lưu manh nguy hiểm với công nghệ. in firmware FSP line Renesas RA.
Trong bài viết trước “Trải nghiệm đầu tiên về quá trình phát triển MCU hiệu suất cao dòng Renesas RA8”, Pi Ziheng đã đưa ra cho mọi người kinh nghiệm nhanh ba thành phần chính trong quá trình phát triển MCU của Renesas (môi trường phát triển e2 studio, gói phần mềm FSP và bảng đánh giá EK). (Bài viết này chủ yếu phân tích phần driver ngoại vi).
Chúng tôi đã thử so sánh các chương trình cơ sở gói của STMicroelectronics, NXP và Renesas để tìm ra những điểm khác biệt về kiến trúc của chúng.
Đầu tiên, hãy xem STMicroelectronics, công ty đã thiết lập hệ thống sinh thái phần sụn từ khá sớm. Miếng là Gói MCU STM32Cube. Liên quan đến Milddeware Nó cho thấy CMSIS là một mã cấp trung tương đối phổ biến.
Trong số đó, chúng tôi chủ yếu tập trung vào quá trình điều khiển BSP và HAL. bo mạch cấp độ (chẳng hạn như Codec, các biến cảm khác nhau, vv) và HAL là trình điều khiển ngoại vi trên chip MCU. HAL.
Về HAL điều khiển ở đây, cần phải mở rộng hơn nữa. Thư viện LL (Lớp vật tượng cứng) và Thư viện LL (Lớp thấp), HAL trong sơ đồ kiến trúc thực chất đề cập đến thư viện HAL và thư viện LL Cách hiểu đơn giản về mối mọt. quan hệ giữa thư viện này là SPL = HAL + LL.
Cơ sở thư viện file: xxxMCU_ll_xxxPeripheral.c/h, API được cung cấp chủ yếu là một thao tác cài đặt duy nhất cho các thanh ghi ngoại vi trên chip, API có tên là LL_PERIPHERAL_xxxAction() ErrorStatus LL_USART_Init(USART_TypeDef *USARTx, LL_USART_InitTypeDef *USART_InitStruct) Tệp lớp tượng tượng: xxxMCU_hal_xxxPeripheral.c/h. API này có tên là HAL_PERIPHERAL_xxxFunc(). Ví dụ nguyên mẫu: HAL_StatusTypeDef HAL_USART_Init(USART_HandleTypeDef *husart) Tệp tiêu chuẩn: xxxMCU_xxxPeripheral. được cung cấp bao gồm cả LL và HAL ở trên Chức năng (nhưng mức độ phát triển khai thác thấp hơn một chút), API đã được đặt tên là PERIPHERAL_xxxFunc/Action() Ví dụ về nguyên mẫu: void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct)
Hãy xem chủ sở hữu NXP Semiconductors của Pi Ziheng. trên (phần cứng MCU, CMSIS, HAL điều khiển, Middleware & BSP, Ứng dụng được xuất ra khác với quan điểm của ST, CMSIS). Ở đây gần với phần cứng MCU. Rõ ràng NXP cho rằng CMSIS cũng là cơ sở mã hóa.
Trong kiến trúc NXP, BSP và HAL không nằm trên cùng một lớp, điều này xác định rằng BSP là mã dựa trên HAL. của NXP tương tự như tiêu chuẩn thư viện ban đầu SPL của STMicroelectronics, nhưng mức độ phong phú của API chức năng vượt xa SPL.
Tệp lớp vật thể: fsl_xxxPeripheral.c/h, API được cung cấp bao gồm cả thao tác cài đặt duy nhất của các thanh ghi ngoại vi trên chip API được đặt tên là PERIPHERAL_xxxFunc/Action(). Ví dụ: status_t LPUART_Init(. LPUART_Type. *cơ sở, const lpuart_config_t *config, uint32_t srcClock_Hz);
Cuối cùng, nhìn vào Renesas FSP, nó không hiển thị cấu trúc phân cấp rõ ràng, nhưng có thể thấy rằng BSP và HAL không nằm trên cùng một lớp trong kiến trúc Renesas và BSP nằm dưới HAL. BSP ở đây cũng bao gồm CMSIS. Rõ ràng Renesas tin rằng BSP bao gồm cả phần cứng cơ bản liên quan đến lõi MCU và trình điều khiển phần cứng thiết bị cấp bo mạch.
Thiết kế của trình điều khiển Renesas HAL khá thú vị. Không giống như STMicroelectronics và NXP, nó chú ý nhiều hơn đến tính trừu tượng của các chức năng ngoại vi (cũng có thể hiểu là hướng đối tượng hơn). được tạo để xác định nguyên mẫu API, nguyên mẫu tập trung vào hoạt động chức năng chung của các thiết bị ngoại vi, đồng thời bỏ qua các chi tiết hoạt động và sự khác biệt của các thiết bị ngoại vi cụ thể. Chúng tôi sẽ thảo luận chi tiết về vấn đề này trong phần tiếp theo.
Tệp lớp trừu tượng: r_xxxModule_api.h, xác định cấu trúc nguyên mẫu API trình điều khiển mô-đun ngoại vi hợp nhất, phù hợp với các tình huống ngoại vi khác nhau có chức năng tương tự (ví dụ: chức năng UART có thể là SCI_USART hoặc SCI_UART hoặc loại khác) r_xxxPeripheral.c/h, Được cung cấp API chủ yếu bao gồm các hoạt động toàn diện về các chức năng cụ thể của các thiết bị ngoại vi trên chip và trên chip. API được đặt tên là R_PERIPHERAL_xxxFunc(). Ví dụ: fsp_err_t. R_SCI_B_UART_Open (uart_ctrl_t * const p_api_ctrl, uart_cfg_t const * const p_cfg)
Trong dự án mẫu lpm_ek_ra8m1_ep ở bài viết trước, chúng tôi thấy rằng có thư mục ra sau, đây là tệp nguồn liên quan đến gói FSP. Chúng ta hãy phân tích nó dựa trên các tệp nguồn cụ thể:
Trước hết, có sự khác biệt nhỏ giữa ba công ty trong việc đặt tên tệp hệ thống (tệp tiêu đề và tệp khởi động), nhưng điểm khác biệt lớn nhất là định nghĩa thanh ghi ngoại vi trong tệp tiêu đề mô hình, liên quan chặt chẽ đến việc triển khai mã tiếp theo. trong trình điều khiển HAL.
Loại tệp | STVi điện tử | Chất bán dẫn NXP | Renesas Điện tử |
---|---|---|---|
Tệp tiêu đề sê-ri | stm32xxxx.h | fsl_device_registers.h | Renesas.h |
Tệp tiêu đề mô hình | xxxMcu.h | xxxMCU.h | xxxMCU.h |
tập tin khởi động | startup_xxxMcu.s | startup_xxxMcu.s | khởi động.c |
Tệp khởi tạo | system_xxxMcu.c/h | system_xxxMcu.c/h | hệ thống.c/h |
Về mặt định nghĩa nguyên mẫu thanh ghi ngoại vi trong tệp tiêu đề, tiếng Ý và NXP là nhất quán. Mỗi thanh ghi được lưu trữ với một loại uint32_t, trong khi Renesas sử dụng một liên kết để lưu trữ từng thanh ghi. Điều này không chỉ cho phép toàn bộ thanh ghi có thể được truy cập. và các bit chức năng cụ thể trong thanh ghi cũng có thể được truy cập bằng trường bit.
Ngoài ra, cả ba công ty đều đã tạo ra các định nghĩa mặt nạ và pos cho các bit chức năng đơn/đa bit của các thanh ghi ngoại vi để tạo điều kiện thuận lợi cho mã thực hiện các hoạt động bit liên quan. Để tạo điều kiện thuận lợi cho việc gán các vùng bit chức năng nhiều bit, NXP và STMicroelectronics có các định nghĩa bổ sung (để đạt được hiệu quả của Renesas khi sử dụng phép kết hợp để xác định nguyên mẫu thanh ghi ngoại vi).
xxxPERIPHERAL_xxxREGISTER_xxxFunc_Msk/MASK xxxPERIPHERAL_xxxREGISTER_xxxFunc_Pos/SHIFT // NXP đã xác định thêm các macro sau để gán các vùng bit chức năng nhiều bit xxxPERIPHERAL_xxxREGISTER_xxxFunc() // Phương pháp của Ý sử dụng trực tiếp nhiều macro để hỗ trợ thiết lập từng bit của vùng bit chức năng nhiều bit xxxPERIPHERAL_xxxREGISTER_xxxFunc xxxPERIPHERAL_xxxREGISTER_xxxFunc_0 xxxPERIPHERAL_xxxREGISTER_xxxFunc_1 ...
Về cấu trúc mã của chính trình điều khiển HAL, chúng tôi chủ yếu phân tích định nghĩa tham số chính thức đầu tiên của ba API để biết những điểm khác biệt chính. Trong số đó, thư viện NXP và STMicroelectronics LL là con trỏ tới các cấu trúc nguyên mẫu ngoại vi, trong khi thư viện STMicroelectronics HAL và Renesas It. là một con trỏ tới khối điều khiển ngoại vi tùy chỉnh. Khối trước ở gần lớp dưới cùng và khối sau ở gần lớp ứng dụng hơn. .
tham số | STVi điện tử | Chất bán dẫn NXP | Renesas Điện tử |
---|---|---|---|
cái đầu tiên | Thư viện LL: PERIPHERAL_TypeDef * Thư viện HAL: PERIPHERAL_HandleTypeDef * |
PERIPHERAL_Loại * | module_ctrl_t * const |
Pi Ziheng đã đề cập trước đó rằng Renesas có một tệp r_xxxModule_api.h bổ sung. Hãy lấy thiết bị ngoại vi SCI làm ví dụ, tương ứng với tệp r_uart_api.h. Tệp này xác định bộ hành động API tiêu chuẩn sau. Hãy để tên hàm trình điều khiển (chẳng hạn như init, deinit, v.v.) giống một hành động của lớp ứng dụng hơn.
/** Định nghĩa Giao diện chia sẻ cho UART */ typedef struct st_uart_api { fsp_err_t (* open)(uart_ctrl_t * const p_ctrl, uart_cfg_t const * const p_cfg); fsp_err_t (* read)(uart_ctrl_t * const p_ctrl, uint8_t * const p_dest, uint32_t const byte); fsp_err_t (* ghi)(uart_ctrl_t * const p_ctrl, uint8_t const * const p_src, uint32_t const byte); fsp_err_t (* baudSet)(uart_ctrl_t * const p_ctrl, void const * const p_baudrate_info); fsp_err_t (* callbackSet)(uart_ctrl_t * const p_ctrl, void (* fsp_err_t (* readStop)(uart_ctrl_t * const p_ctrl, uint32_t * còn lại_byte); } uart_api_t;
Trong tệp r_sci_b_uart.c, chức năng trình điều khiển UART được triển khai dựa trên các thiết bị ngoại vi SCI được khởi tạo cho uart_api_t, do đó các ứng dụng lớp trên chỉ có thể gọi các giao diện trong uart_api_t để triển khai các chức năng cụ thể mà không cần phải quan tâm đến loại giao diện bên ngoài nào. các giao diện được tạo ra. Nó được thiết kế để hiện thực hóa. Ưu điểm của thiết kế này là tạo điều kiện cho mã xuyên ngoại vi (cross-MCU) và dễ dàng ghép mã. Nhược điểm là nó hạn chế sự phong phú của API và gây khó khăn cho việc thể hiện các đặc điểm khác biệt giữa các thiết bị ngoại vi.
/* UART trên ánh xạ API SCI HAL cho giao diện UART */ const uart_api_t g_uart_on_sci_b = { .open = R_SCI_B_UART_Open, .close = R_SCI_B_UART_Close, .write = R_SCI_B_UART_Write, .read = R_SCI_B_UART_Read, .infoGet = R_SCI_B_UART_InfoGet, .baudSet = R_SCI_B_UART_BaudSet, .communicationAbort = R_SCI_B_UART_Abort, .callbackSet = R_SCI_B_UART_CallbackSet, .readStop = R_SCI_B_UART_ReadStop, };
Đến đây, Pi Ziheng đã giới thiệu xong các trình điều khiển ngoại vi trong thư viện chương trình cơ sở FSP dòng Renesas RA, tiếng vỗ tay đâu rồi ~~~.
Bài viết sẽ được xuất bản đồng thời lên trang chủ blog park, trang chủ CSDN, trang chủ Zhihu và nền tảng tài khoản công khai WeChat của tôi.
Tìm kiếm "Pi Zi Heng Embedded" trên WeChat hoặc quét mã QR bên dưới để xem ngay trên điện thoại di động của bạn.
Cuối cùng, bài viết này về Piziheng Embedded: Phân tích Thư viện chương trình cơ sở FSP dòng RA của Renesas RA kết thúc tại đây. Nếu bạn muốn biết thêm về Piziheng Embedded: Phân tích Thư viện chương trình cơ sở FSP dòng Renesas RA Để biết nội dung trình điều khiển ngoại vi, vui lòng tìm kiếm các bài viết về CFSDN hoặc. tiếp tục duyệt các bài viết liên quan, tôi hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai! .
Tôi muốn sử dụng Fiware cygnus để lưu dữ liệu từ tác nhân ngữ cảnh vào phiên bản CKAN. Tôi đã tạo phiên bản orion-psb-image-R5.4 1.7.0 trên orion trên đám mây Fiware
Cài đặt và chạy Cygnus (đăng ký Orion). Orion nhận thông báo từ khách hàng (thông qua ioagent). Làm cách nào để bắt đầu và tạo cơ sở dữ liệu postgresql liên tục? Truy cập chương trình cơ sở từ máy chủ từ xa. Không biết nên thực hiện lệnh nào
Tôi cần viết một ứng dụng Android tìm kiếm chương trình cơ sở trên internet và cho phép tự động tải xuống chương trình cơ sở đã chọn và thực hiện cập nhật trên thiết bị. Có thể được không? Cảm ơn Câu trả lời tốt nhất nên là có. Tôi đang cố gắng làm điều tương tự. Tôi đã đăng một bài viết về điều này với tư cách là một người dùng khác
Tôi chỉ có thể xây dựng chương trình cơ sở cho tất cả các nhánh của NodeMCU, https://github.com/nodemcu/nodemcu-firmware nếu tôi sao chép chúng vào các thư mục cục bộ riêng biệt. Khi tôi cố gắng chỉ có một thư mục và sử dụng
Tôi đã cài đặt cygnus bằng RPM trên hình ảnh chương trình cơ sở CentOS-7-x64, nhưng tôi không thể khởi động nó như một dịch vụ, đây là nhật ký của tôi: [centos@cygnus-mongo conf]$ sudo service
Tôi biết bạn có thể sử dụng bộ lọc định vị địa lý queryContext Orion. Có thể thực hiện lọc tương tự trong trường hợp đăng ký không? Nói cách khác, có thể chỉ thông báo cho tôi về những thay đổi đối với thuộc tính của thực thể ngữ cảnh khi thuộc tính vị trí nằm trong khu vực được xác định trước không? Ví dụ: Cảm ơn bạn.
Tôi đang cập nhật một ứng dụng ban đầu tương thích với iOS 2.0 trở lên. Vì Apple bỏ hỗ trợ cho các phiên bản <3.0 nên tôi buộc phải bỏ hỗ trợ cho 2.0. Một số sử dụng iPod Touch thế hệ thứ 2 Beta
Tôi là nhà phát triển trả phí và tôi vừa nhận ra rằng mình cần hạ cấp 3GS của mình từ 4.0 mà không cần sử dụng XCode. Tôi có thể lấy phần sụn ở đâu? Câu trả lời hay nhất http://www.felixbruns.de/iPod/fir
Tôi đang phát triển trình kết nối từ iDigi ( http://www.idigi.com ) tới Arduino Mega. Điều tôi muốn làm là cho phép iDigi cập nhật chương trình cơ sở Arduino của tôi từ xa. kế hoạch đầu tiên của tôi
Tôi có tập lệnh shell cài đặt phần mềm trên thiết bị đang chạy (Linkit Smart 7688 Duo với OpenWrt). Nó chứa gói python tùy chỉnh của tôi và một vài tệp khác nhau. Tôi đã quản lý để lấy được mã nguồn cho việc này
Chạy ma trong thư mục phần sụn của https://github.com/ArduPilot/SiK/tree/8a690a28647ee6085e7dce456ab3963a350acb2d trên OSX
Với việc iOS 4 sắp được phát hành, tôi đã lên kế hoạch đưa iAd vào các bản cập nhật ứng dụng của mình trong tương lai. Tôi nghĩ điều này sẽ khiến ứng dụng của tôi không thể sử dụng được đối với bất kỳ ai có chương trình cơ sở thấp hơn 4.0. Có cách nào để thay đổi các biến này và .x dựa trên firmware của người dùng không
Là một phần của chương trình tăng tốc FINISH, chúng tôi sử dụng FIWARE KeyRock và Wirecloud. Chúng tôi hiện đang sử dụng phiên bản toàn cầu của phòng thí nghiệm Fiware để điều tra. Chúng tôi muốn giới hạn hệ thống của mình để người dùng chỉ có thể kiểm tra
Tôi đang thử nghiệm trên bo mạch 6SX-SABRE-SBD. Bo mạch chủ này được trang bị i.MX6SX, CPU lõi kép không đối xứng: Cortex A9 và Cortex M4. Hiện tại hệ thống đang sử dụng U-Boot và
Tôi muốn nối hai bảng trong cơ sở dữ liệu khác nhau trên cùng một máy chủ. Ai đó có thể cho tôi biết cách thực hiện việc này trong Zend Framework Db Adaptor không? Để có câu trả lời đúng nhất, hãy xem: kết nối với hai thiết bị khác nhau
Hiện tại tôi muốn phát triển các bản cập nhật OTA chương trình cơ sở Android cho sản phẩm của chúng tôi. Trong khi nghiên cứu cách thực hiện việc này, tôi được biết rằng tôi cần một máy chủ web cho chương trình cơ sở. Hãy sửa tôi nếu tôi sai. Ai có thể giúp tôi nên sử dụng máy chủ web nào phù hợp nhất không?
Vì vậy, tôi mới chuyển từ Windows 10 sang Linux Mint rosa. Tôi đang cố gắng tìm cách tải xuống chương trình cơ sở qua Eclipse. Bất cứ khi nào tôi nhấp vào plugin thì tôi nhận được chương trình cơ sở; "Không khởi động được nxjflashg org.lejos.
Tôi đã tạo một ứng dụng quay video cho Google Glass. Ứng dụng hoạt động tốt cho đến khi Google phát hành firmware XE19.1. Tôi có một chiếc Google Glass khác có firmware XE18.11. Ứng dụng vẫn có trên XE1
Câu hỏi này đã có câu trả lời ở đây: Debian 8. Không tải được iwlwifi (4 câu trả lời) Đã đóng 5 năm trước. Xin chào, tôi có chiếc Lenovo T460 và vừa cài đặt Debian
Chúng tôi nhận thấy hành vi không mong muốn trong Unity khi đăng ký cùng một lớp cụ thể cho các phiên bản chưa được đặt tên khác nhau. Trong trường hợp này, việc đăng ký dường như can thiệp lẫn nhau theo những cách không mong muốn. Chúng tôi cung cấp một giao diện khung khác cho các ứng dụng khác mà chúng tôi muốn đưa vào
Tôi là một lập trình viên xuất sắc, rất xuất sắc!