{"id":23616,"date":"2026-05-07T09:04:26","date_gmt":"2026-05-07T09:04:26","guid":{"rendered":"https:\/\/umang.pk\/2026\/05\/07\/qrt-%d9%85%d9%88%d8%a8%d8%a7%d8%a6%d9%84-%d9%81%d9%88%d9%86-%d9%be%d8%b1%d9%88%d8%b3%db%8c%d8%b3%d8%b1-%da%a9%db%92-%d8%a7%d9%86%d8%af%d8%b1-%d8%a7%db%8c%da%a9-%d8%ad%d9%82%db%8c%d9%82%db%8c-%d9%88\/"},"modified":"2026-05-07T09:04:31","modified_gmt":"2026-05-07T09:04:31","slug":"qrt-%d9%85%d9%88%d8%a8%d8%a7%d8%a6%d9%84-%d9%81%d9%88%d9%86-%d9%be%d8%b1%d9%88%d8%b3%db%8c%d8%b3%d8%b1-%da%a9%db%92-%d8%a7%d9%86%d8%af%d8%b1-%d8%a7%db%8c%da%a9-%d8%ad%d9%82%db%8c%d9%82%db%8c-%d9%88","status":"publish","type":"post","link":"https:\/\/umang.pk\/en_us\/2026\/05\/07\/qrt-%d9%85%d9%88%d8%a8%d8%a7%d8%a6%d9%84-%d9%81%d9%88%d9%86-%d9%be%d8%b1%d9%88%d8%b3%db%8c%d8%b3%d8%b1-%da%a9%db%92-%d8%a7%d9%86%d8%af%d8%b1-%d8%a7%db%8c%da%a9-%d8%ad%d9%82%db%8c%d9%82%db%8c-%d9%88\/","title":{"rendered":"QRT: \u0645\u0648\u0628\u0627\u0626\u0644 \u0641\u0648\u0646 \u067e\u0631\u0648\u0633\u06cc\u0633\u0631 \u06a9\u06d2 \u0627\u0646\u062f\u0631 \u0627\u06cc\u06a9 \u062d\u0642\u06cc\u0642\u06cc \u0648\u0642\u062a \u06a9\u0627 OS [Full Handbook]"},"content":{"rendered":"\n<div id=\"\">\n<p>Qualcomm \u067e\u0631 \u0645\u0628\u0646\u06cc \u062a\u0645\u0627\u0645 \u0641\u0648\u0646\u0632 \u0645\u06cc\u06ba Hexagon DSP \u0648\u06cc\u06a9 \u0627\u067e \u06a9\u0631\u06cc\u06a9\u0679\u0631 \u0688\u06cc\u0679\u06cc\u06a9\u0634\u0646\u060c \u0633\u06cc\u0646\u0633\u0631 \u067e\u0631\u0648\u0633\u06cc\u0633\u0646\u06af\u060c \u0634\u0648\u0631 \u06a9\u06cc\u0646\u0633\u0644\u06cc\u0634\u0646\u060c \u0627\u0648\u0631 \u0628\u0644\u0648\u0679\u0648\u062a\u06be \u0622\u0688\u06cc\u0648 \u0627\u0633\u0679\u0631\u06cc\u0645\u0646\u06af \u06a9\u0648 \u06c1\u06cc\u0646\u0688\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u062c\u0628\u06a9\u06c1 \u0628\u0646\u06cc\u0627\u062f\u06cc ARM CPU \u0627\u06cc\u0646\u0688\u0631\u0627\u0626\u06cc\u0688 \u0686\u0644\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>DSP \u062c\u0633 \u0622\u067e\u0631\u06cc\u0679\u0646\u06af \u0633\u0633\u0679\u0645 \u06a9\u0648 \u0622\u067e\u0631\u06cc\u0679 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0648\u0622\u0631\u0688\u06cc\u0646\u06cc\u0679 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0648\u06c1 Qualcomm \u0631\u06cc\u0626\u0644 \u0679\u0627\u0626\u0645 \u0622\u067e\u0631\u06cc\u0679\u0646\u06af \u0633\u0633\u0679\u0645 (QRT) \u06c1\u06d2\u060c \u0627\u06cc\u06a9 POSIX \u062c\u06cc\u0633\u0627 \u062a\u0631\u062c\u06cc\u062d\u06cc \u0628\u0646\u06cc\u0627\u062f \u067e\u0631 \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u062a\u06cc\u0627\u0631 \u06a9\u0631\u062f\u06c1 RTOS \u062e\u0627\u0635 \u0637\u0648\u0631 \u067e\u0631 Qualcomm \u06a9\u06d2 Hexagon \u0688\u06cc\u062c\u06cc\u0679\u0644 \u0633\u06af\u0646\u0644 \u067e\u0631\u0648\u0633\u06cc\u0633\u0631\u0632 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0628\u0646\u0627\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u06cc\u06c1 \u062f\u0633\u062a\u0627\u0648\u06cc\u0632 Qualcomm \u06a9\u06d2 \u0631\u06cc\u0626\u0644 \u0679\u0627\u0626\u0645 \u0622\u067e\u0631\u06cc\u0679\u0646\u06af \u0633\u0633\u0679\u0645 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u0639\u0645\u0644\u06cc \u06af\u0627\u0626\u06cc\u0688 \u06c1\u06d2\u06d4 \u06c1\u0645 QRT \u06a9\u0648 \u06af\u0631\u0627\u0624\u0646\u0688 \u0627\u067e \u0633\u06d2 \u06a9\u0648\u0631 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0628\u0634\u0645\u0648\u0644 \u0641\u0646 \u062a\u0639\u0645\u06cc\u0631\u060c \u062f\u06be\u0627\u06af\u06d2 \u06a9\u06cc \u062a\u062e\u0644\u06cc\u0642\u060c \u0645\u0637\u0627\u0628\u0642\u062a \u067e\u0630\u06cc\u0631\u06cc \u067e\u0631\u0627\u0626\u0645\u06cc\u0679\u0648\u0632\u060c \u0645\u06cc\u0645\u0648\u0631\u06cc \u0645\u06cc\u0646\u062c\u0645\u0646\u0679\u060c \u0627\u0646\u0679\u0631\u067e\u0679 \u06c1\u06cc\u0646\u0688\u0644\u0646\u06af\u060c \u0679\u0627\u0626\u0645\u0631\u0632\u060c \u0641\u0627\u0633\u0679 \u0622\u0631 \u067e\u06cc \u0633\u06cc \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0627\u0646\u0679\u0631 \u067e\u0631\u0648\u0633\u06cc\u0633\u0631 \u06a9\u0645\u06cc\u0648\u0646\u06cc\u06a9\u06cc\u0634\u0646\u060c \u0627\u0648\u0631 \u0645\u06a9\u0645\u0644 \u0633\u06cc\u0646\u0633\u0631 \u0641\u06cc\u0648\u0698\u0646 \u067e\u0627\u0626\u067e \u0644\u0627\u0626\u0646\u06d4 \u06c1\u0631 \u062a\u0635\u0648\u0631 \u0645\u06cc\u06ba \u0648\u0631\u06a9\u0646\u06af \u06a9\u0648\u0688 \u0627\u0648\u0631 \u06c1\u0688 \u06a9\u06d2 \u0646\u06cc\u0686\u06d2 \u06a9\u06cc\u0627 \u06c1\u0648 \u0631\u06c1\u0627 \u06c1\u06d2 \u0627\u0633 \u06a9\u06cc \u062a\u0641\u0635\u06cc\u0644 \u0634\u0627\u0645\u0644 \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-table-of-contents\">\u0627\u0646\u0688\u06cc\u06a9\u0633<\/h2>\n<h2 id=\"heading-why-qurt-matters\">QRT \u06a9\u06cc\u0648\u06ba \u0627\u06c1\u0645 \u06c1\u06d2\u06d4<\/h2>\n<p>\u0627\u0633 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u0633\u0648\u0686\u06cc\u06ba \u06a9\u06c1 \u0641\u0648\u0646 \u06a9\u0627\u0644 \u06a9\u06d2 \u062f\u0648\u0631\u0627\u0646 \u06a9\u06cc\u0627 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0622\u0644\u06c1 \u0628\u06cc\u06a9 \u0648\u0642\u062a \u0645\u0627\u0626\u06cc\u06a9\u0631\u0648\u0641\u0648\u0646 \u0622\u0688\u06cc\u0648 \u067e\u0631 \u0634\u0648\u0631 \u0645\u0646\u0633\u0648\u062e\u06cc \u0627\u0646\u062c\u0627\u0645 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u060c \u0648\u06cc\u06a9 \u0648\u0631\u0688 \u06a9\u0627 \u067e\u062a\u06c1 \u0644\u06af\u0627\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u0646\u06cc\u0648\u0631\u0644 \u0646\u06cc\u0679 \u0648\u0631\u06a9 \u0686\u0644\u0627\u062a\u0627 \u06c1\u06d2\u060c \u0627\u06cc\u06a9\u0633\u0644\u0631\u0648\u0645\u06cc\u0679\u0631 \u0688\u06cc\u0679\u0627 \u06a9\u0648 \u0641\u06cc \u0633\u06cc\u06a9\u0646\u0688 400 \u0628\u0627\u0631 \u067e\u0691\u06be\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0628\u0644\u0648\u0679\u0648\u062a\u06be \u0622\u0688\u06cc\u0648 \u0627\u0633\u0679\u0631\u06cc\u0645\u0646\u06af \u06a9\u0627 \u0627\u0646\u062a\u0638\u0627\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u0646 \u0645\u06cc\u06ba \u0633\u06d2 \u06a9\u0648\u0626\u06cc \u0628\u06be\u06cc \u0645\u0642\u0627\u0645\u06cc ARM CPU \u067e\u0631 \u0646\u06c1\u06cc\u06ba \u0686\u0644\u06d2 \u06af\u0627\u06d4 \u06cc\u06c1 \u0633\u0628 Qualcomm \u0645\u06cc\u06ba \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4 <strong>\u0645\u0633\u062f\u0633 \u0688\u06cc \u0627\u06cc\u0633 \u067e\u06cc<\/strong>\u0622\u067e\u0631\u06cc\u0679\u0646\u06af \u0633\u0633\u0679\u0645 \u062c\u0648 \u0627\u0633 \u06a9\u0648 \u0627\u06cc\u0688\u062c\u0633\u0679 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0646 \u0645\u06cc\u06ba \u0634\u0627\u0645\u0644 \u06c1\u06cc\u06ba: <strong>QRT<\/strong>.<\/p>\n<p>Qualcomm \u0631\u06cc\u0626\u0644 \u0679\u0627\u0626\u0645 \u0622\u067e\u0631\u06cc\u0679\u0646\u06af \u0633\u0633\u0679\u0645 (QRT) \u0627\u06cc\u06a9 POSIX \u062c\u06cc\u0633\u0627 \u062a\u0631\u062c\u06cc\u062d\u06cc \u0628\u0646\u06cc\u0627\u062f \u067e\u0631 \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u062a\u06cc\u0627\u0631 \u06a9\u0631\u062f\u06c1 RTOS \u06c1\u06d2 \u062c\u0648 Qualcomm \u06a9\u06d2 Hexagon \u0688\u06cc\u062c\u06cc\u0679\u0644 \u0633\u06af\u0646\u0644 \u067e\u0631\u0648\u0633\u06cc\u0633\u0631 \u067e\u0631 \u0686\u0644\u062a\u0627 \u06c1\u06d2\u06d4 \u062c\u0628 \u06a9\u06c1 \u0644\u06cc\u0646\u06a9\u0633 \u0627\u06cc\u06a9 \u0639\u0627\u0645 \u0645\u0642\u0635\u062f \u06a9\u0627 \u0622\u067e\u0631\u06cc\u0679\u0646\u06af \u0633\u0633\u0679\u0645 \u06c1\u06d2 \u062c\u0648 \u0644\u0686\u06a9 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0688\u06cc\u0632\u0627\u0626\u0646 \u06a9\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u060c \u06a9\u06cc\u0648 \u0622\u0631 \u0679\u06cc \u0627\u06cc\u06a9 \u062f\u0631\u0633\u062a \u0622\u0644\u06c1 \u06c1\u06d2 \u062c\u0648 \u0645\u0627\u0626\u06cc\u06a9\u0631\u0648 \u0633\u06cc\u06a9\u0646\u0688 \u0644\u06cc\u0648\u0644 \u06a9\u06d2 \u0646\u0638\u0627\u0645 \u0627\u0644\u0627\u0648\u0642\u0627\u062a \u06a9\u06d2 \u0644\u06cc\u06d2 \u0688\u06cc\u0632\u0627\u0626\u0646 \u06a9\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-where-qurt-fits-in-the-system\">\u062c\u06c1\u0627\u06ba QRT \u0622\u067e \u06a9\u06d2 \u0633\u0633\u0679\u0645 \u0645\u06cc\u06ba \u0641\u0679 \u0628\u06cc\u0679\u06be\u062a\u0627 \u06c1\u06d2\u06d4<\/h3>\n<p>\u06cc\u06c1 \u062e\u0627\u06a9\u06c1 Qualcomm SoC \u06a9\u06d2 \u0627\u0646\u062f\u0631 \u062f\u0648 \u067e\u0631\u0648\u0633\u06cc\u0633\u0631 \u06a9\u06d2 \u0641\u0646 \u062a\u0639\u0645\u06cc\u0631 \u06a9\u0648 \u062f\u06a9\u06be\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u0628\u0627\u0626\u06cc\u06ba \u0637\u0631\u0641 \u06a9\u0627 ARM CPU Android \u06cc\u0627 Linux \u0686\u0644\u0627\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0639\u0627\u0645 \u0627\u06cc\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0645\u0646\u0637\u0642 \u06a9\u0648 \u06c1\u06cc\u0646\u0688\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u062f\u0627\u0626\u06cc\u06ba \u0637\u0631\u0641 Hexagon DSP QuRT \u0686\u0644\u0627\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0622\u0688\u06cc\u0648 \u067e\u0631\u0648\u0633\u06cc\u0633\u0646\u06af\u060c \u0633\u06cc\u0646\u0633\u0631 \u0641\u06cc\u0648\u0698\u0646\u060c ML \u0627\u0646\u0641\u0631\u0646\u0633\u060c \u0627\u0648\u0631 \u06a9\u0645\u067e\u06cc\u0648\u0679 \u0622\u0641 \u0644\u0648\u0688 \u0633\u0645\u06cc\u062a \u062a\u0627\u062e\u06cc\u0631 \u0633\u06d2 \u0645\u062a\u0639\u0644\u0642 \u062d\u0633\u0627\u0633 \u06a9\u0627\u0645 \u06a9\u06d2 \u0628\u0648\u062c\u06be \u06a9\u0648 \u06c1\u06cc\u0646\u0688\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u062f\u0648 \u067e\u0631\u0648\u0633\u06cc\u0633\u0631\u0632 \u062f\u0631\u062c \u0630\u06cc\u0644 \u0641\u0631\u06cc\u0645 \u0648\u0631\u06a9 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0628\u0627\u062a \u0686\u06cc\u062a \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba: <strong>\u062a\u06cc\u0632 \u0622\u0631 \u067e\u06cc \u0633\u06cc<\/strong>. \u0622\u067e \u0627\u067e\u0646\u0627 DSP-\u0633\u0627\u0626\u06cc\u0688 \u06a9\u0648\u0688 \u0644\u06a9\u06be\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 Hexagon SDK \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0627\u0648\u0631 QRT \u0648\u06c1 OS \u06c1\u06d2 \u062c\u0648 \u0622\u067e \u06a9\u06d2 \u06a9\u0648\u0688 \u06a9\u0648 \u06c1\u06cc\u06a9\u0633\u0627\u06af\u0648\u0646 \u067e\u0631\u0648\u0633\u06cc\u0633\u0631 \u067e\u0631 \u0686\u0644\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-setting-up-your-development-environment\">\u062a\u0631\u0642\u06cc\u0627\u062a\u06cc \u0645\u0627\u062d\u0648\u0644 \u06a9\u06cc \u062a\u0631\u062a\u06cc\u0628\u0627\u062a<\/h2>\n<p>QRT \u06a9\u0648\u0688 \u0644\u06a9\u06be\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2\u060c \u0622\u067e \u06a9\u0648 \u0627\u06cc\u06a9 \u0679\u0648\u0644 \u0686\u06cc\u0646 \u0627\u0648\u0631 \u0627\u06cc\u06a9 \u0633\u0645\u06cc\u0644\u06cc\u0679\u0631 \u06cc\u0627 \u0641\u0632\u06cc\u06a9\u0644 \u06c1\u0627\u0631\u0688\u0648\u06cc\u0626\u0631 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-prerequisites\">\u0634\u0631\u0637\u06cc\u06ba<\/h3>\n<p>Hexagon SDK (\u0648\u0631\u0698\u0646 3.5+ \u06cc\u0627 4.x) \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u060c \u062c\u0648 Qualcomm \u06a9\u0627 \u0622\u0641\u06cc\u0634\u0644 SDK \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u0633 \u0645\u06cc\u06ba Hexagon Tools \u06a9\u0645\u067e\u0627\u0626\u0644\u0631 \u0679\u0648\u0644 \u0686\u06cc\u0646 \u0634\u0627\u0645\u0644 \u06c1\u06d2\u06d4<\/p>\n<p>\u06a9\u0648\u0688 \u06a9\u0648 \u0686\u0644\u0627\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2\u060c \u0622\u067e Qualcomm \u0688\u06cc\u0648\u0644\u067e\u0645\u0646\u0679 \u0628\u0648\u0631\u0688 (\u062c\u06cc\u0633\u06d2 Robotics RB5 \u06cc\u0627 SM8250 HDK) \u06cc\u0627 SDK \u0645\u06cc\u06ba \u0628\u0646\u0627\u06cc\u0627 \u06c1\u0648\u0627 \u0633\u0645\u06cc\u0644\u06cc\u0679\u0631 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u0648\u0628\u0646\u0679\u0648 18.04 \u06cc\u0627 20.04 \u067e\u0631 \u0686\u0644\u0646\u06d2 \u0648\u0627\u0644\u0627 \u0644\u06cc\u0646\u06a9\u0633 \u06c1\u0648\u0633\u0679 \u0633\u0633\u0679\u0645 \u062a\u0631\u0642\u06cc \u06a9\u06d2 \u0644\u06cc\u06d2 \u0628\u06c1\u062a\u0631\u06cc\u0646 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-installing-the-hexagon-sdk\">\u06c1\u06cc\u06a9\u0633\u0627\u06af\u0648\u0646 SDK \u0627\u0646\u0633\u0679\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/h3>\n<pre><code class=\"language-shell\"># Download the Hexagon SDK from Qualcomm's developer portal\n# https:\/\/developer.qualcomm.com\/software\/hexagon-dsp-sdk\n\n# Extract and run the installer\nchmod +x qualcomm_hexagon_sdk_4_x_x_x.bin\n.\/qualcomm_hexagon_sdk_4_x_x_x.bin\n\n# Set up environment variables\nexport HEXAGON_SDK_ROOT=~\/Qualcomm\/Hexagon_SDK\/4.x.x.x\nexport HEXAGON_TOOLS_ROOT=~\/Qualcomm\/Hexagon_SDK\/4.x.x.x\/tools\nsource $HEXAGON_SDK_ROOT\/setup_sdk_env.source\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u0622\u067e \u06a9\u06cc \u06c1\u0648\u0645 \u0688\u0627\u0626\u0631\u06a9\u0679\u0631\u06cc \u0645\u06cc\u06ba SDK \u06a9\u0648 \u0627\u0646\u0633\u0679\u0627\u0644 \u06a9\u0631\u06d2 \u06af\u0627 \u0627\u0648\u0631 \u0622\u067e \u06a9\u06d2 \u0628\u0644\u0688 \u0633\u0633\u0679\u0645 \u0627\u0648\u0631 \u0633\u0645\u06cc\u0644\u06cc\u0679\u0631 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0636\u0631\u0648\u0631\u06cc \u0645\u0627\u062d\u0648\u0644\u06cc\u0627\u062a\u06cc \u0645\u062a\u063a\u06cc\u0631\u0627\u062a \u06a9\u0648 \u0633\u06cc\u0679 \u06a9\u0631\u06d2 \u06af\u0627\u06d4 \u06a9\u06c1 <code>setup_sdk_env.source<\/code> \u0627\u0633\u06a9\u0631\u067e\u0679 \u0634\u06cc\u0644 \u06a9\u0648 \u06a9\u0645\u067e\u0627\u0626\u0644\u0631\u060c \u0633\u0645\u06cc\u0644\u06cc\u0679\u0631 \u0627\u0648\u0631 \u0644\u0627\u0626\u0628\u0631\u06cc\u0631\u06cc\u0648\u06ba \u06a9\u06d2 \u0631\u0627\u0633\u062a\u0648\u06ba \u06a9\u06d2 \u0633\u0627\u062a\u06be \u062a\u0634\u06a9\u06cc\u0644 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-verifying-your-setup\">\u062a\u0631\u062a\u06cc\u0628\u0627\u062a \u0686\u06cc\u06a9 \u06a9\u0631\u06cc\u06ba\u06d4<\/h3>\n<pre><code class=\"language-shell\"># Check the Hexagon compiler\nhexagon-clang --version\n\n# You should see something like:\n# Qualcomm Hexagon Clang version 8.x.xx\n\n# Run the QuRT simulator to make sure it works\n$HEXAGON_SDK_ROOT\/tools\/HEXAGON_Tools\/8.x.xx\/Tools\/bin\/hexagon-sim \n    --simulated_returnval --cosim_file \n    $HEXAGON_SDK_ROOT\/libs\/common\/qurt\/computev66\/sdksim_bin\/osam.cfg \n    -- $HEXAGON_SDK_ROOT\/libs\/common\/qurt\/computev66\/sdksim_bin\/bootimg.pbn\n<\/code><\/pre>\n<p>\u067e\u06c1\u0644\u06cc \u06a9\u0645\u0627\u0646\u0688 \u0627\u0633 \u0628\u0627\u062a \u06a9\u06cc \u062a\u0635\u062f\u06cc\u0642 \u06a9\u0631\u062a\u06cc \u06c1\u06d2 \u06a9\u06c1 \u06c1\u06cc\u06a9\u0633\u0627\u06af\u0648\u0646 \u06a9\u0644\u06cc\u0646\u06af \u06a9\u0645\u067e\u0627\u0626\u0644\u0631 \u0627\u0646\u0633\u0679\u0627\u0644 \u0627\u0648\u0631 \u0642\u0627\u0628\u0644 \u0631\u0633\u0627\u0626\u06cc \u06c1\u06d2\u06d4 \u062f\u0648\u0633\u0631\u06cc \u06a9\u0645\u0627\u0646\u0688 QRT \u0633\u0645\u06cc\u0644\u06cc\u0679\u0631 \u0634\u0631\u0648\u0639 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u060c \u062c\u0648 \u06a9\u06c1 \u0627\u06cc\u0646\u0688\u0631\u0627\u0626\u06cc\u0688 \u0627\u06cc\u0645\u0648\u0644\u06cc\u0679\u0631 \u06a9\u06cc \u0637\u0631\u062d \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0622\u067e \u06a9\u0648 \u0627\u067e\u0646\u06d2 QRT \u067e\u0631\u0648\u06af\u0631\u0627\u0645 \u06a9\u0648 \u0641\u0632\u06cc\u06a9\u0644 \u06c1\u0627\u0631\u0688 \u0648\u06cc\u0626\u0631 \u06a9\u06d2 \u0628\u063a\u06cc\u0631 \u062c\u0627\u0646\u0686\u0646\u06d2 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u06af\u0631\u0686\u06c1 \u0679\u0627\u0626\u0645\u0646\u06af \u0627\u0635\u0644\u06cc \u06c1\u0627\u0631\u0688 \u0648\u06cc\u0626\u0631 \u0633\u06d2 \u0645\u06cc\u0644 \u0646\u06c1\u06cc\u06ba \u06a9\u06be\u0627\u062a\u06cc\u060c \u0644\u06cc\u06a9\u0646 \u0633\u0645\u06cc\u0644\u06cc\u0679\u0631 \u062a\u0631\u0642\u06cc \u06a9\u06d2 \u062f\u0648\u0631\u0627\u0646 \u062f\u0631\u0633\u062a\u06af\u06cc \u06a9\u06cc \u062a\u0635\u062f\u06cc\u0642 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u0641\u06cc\u062f \u06c1\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-project-structure\">\u0645\u0646\u0635\u0648\u0628\u06d2 \u06a9\u06cc \u0633\u0627\u062e\u062a<\/h3>\n<p>\u0645\u0633\u062f\u0633 SDK \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2: <strong>SCons<\/strong> \u0688\u06cc\u0641\u0627\u0644\u0679 \u0628\u0644\u0688 \u0633\u0633\u0679\u0645 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u067e\u0631\u0627\u062c\u06cc\u06a9\u0679\u0633 SDK \u062f\u0631\u062e\u062a \u06a9\u06d2 \u0627\u0646\u062f\u0631 \u0648\u0627\u0642\u0639 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0627\u0646 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0645\u0646\u0638\u0645 \u06c1\u06cc\u06ba: <code>.min<\/code> \u0627\u06cc\u06a9 \u0641\u0627\u0626\u0644 \u062c\u0648 \u0627\u06cc\u06a9 \u0627\u0639\u0644\u0627\u0646\u0627\u062a\u06cc \u062a\u0639\u0645\u06cc\u0631\u0627\u062a\u06cc \u0648\u0636\u0627\u062d\u062a \u06a9\u0646\u0646\u062f\u06c1 \u06c1\u06d2 \u062c\u0648 SDK \u06a9\u06d2 SCons \u0627\u0646\u0641\u0631\u0627\u0633\u0679\u0631\u06a9\u0686\u0631 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u067e\u0627\u0631\u0633 \u06a9\u06cc \u06af\u0626\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u06a9\u0645 \u0627\u0632 \u06a9\u0645 \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u06c1\u06d2:<\/p>\n<pre><code class=\"language-shell\">$HEXAGON_SDK_ROOT\/examples\/my_qurt_project\/\n\u251c\u2500\u2500 src\/\n\u2502   \u2514\u2500\u2500 main.c              # Your QuRT application code\n\u251c\u2500\u2500 inc\/\n\u2502   \u2514\u2500\u2500 my_module.h         # Header files\n\u251c\u2500\u2500 hexagon.min              # SCons build config for Hexagon DSP side\n\u2514\u2500\u2500 android.min              # SCons build config for ARM side (if using FastRPC)\n<\/code><\/pre>\n<p>\u06a9\u06c1 <code>hexagon.min<\/code> \u0641\u0627\u0626\u0644\u06cc\u06ba \u0688\u06cc \u0627\u06cc\u0633 \u067e\u06cc \u0633\u0627\u0626\u06cc\u0688 \u0628\u0644\u0688 \u06a9\u0648 \u062a\u0631\u062a\u06cc\u0628 \u062f\u06cc\u062a\u06cc \u06c1\u06cc\u06ba\u060c <code>android.min<\/code> \u06a9\u0631\u0627\u0633 \u067e\u0631\u0648\u0633\u06cc\u0633\u0631 \u06a9\u0645\u06cc\u0648\u0646\u06cc\u06a9\u06cc\u0634\u0646 \u06a9\u06d2 \u0644\u06cc\u06d2 FastRPC \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u0648\u0642\u062a ARM \u0633\u0627\u0626\u06cc\u0688 \u06a9\u0648 \u06c1\u06cc\u0646\u0688\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u062f\u0648\u0646\u0648\u06ba SDK \u06a9\u06d2 \u0627\u0648\u067e\u0631\u06cc \u0633\u0637\u062d \u067e\u0631 \u067e\u0691\u06be\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 <code>SConstruct<\/code> \u0641\u0627\u0626\u0644\u06cc\u06ba \u06cc\u06c1\u0627\u06ba \u0645\u0648\u062c\u0648\u062f \u06c1\u06cc\u06ba: <code>$HEXAGON_SDK_ROOT\/SConstruct<\/code>. \u0622\u067e \u06a9\u0648 \u0627\u0644\u06af \u0633\u06d2 \u0627\u0633 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 <code>Makefile<\/code> \u06cc\u0627 <code>SConscript<\/code> SDK \u062f\u0631\u062e\u062a \u06a9\u06d2 \u0627\u0646\u062f\u0631 \u0645\u0646\u0635\u0648\u0628\u0648\u06ba \u06a9\u06d2 \u0644\u06cc\u06d2\u06d4<\/p>\n<h3 id=\"heading-build-configuration-with-scons\">SCons \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u06a9\u0646\u0641\u06cc\u06af\u0631\u06cc\u0634\u0646 \u0628\u0646\u0627\u0626\u06cc\u06ba<\/h3>\n<p>\u06a9\u0645 \u0633\u06d2 \u06a9\u0645 <code>hexagon.min<\/code> \u062a\u0639\u0645\u06cc\u0631 \u0641\u0627\u0626\u0644 \u06c1\u06d2:<\/p>\n<pre><code class=\"language-shell\"># hexagon.min - SCons build descriptor for the DSP side\n\nBUILD_LIBS = libmy_qurt_app\n\n# Source files\nlibmy_qurt_app_C_SRCS = src\/main.c\n\n# QuRT OS library\nlibmy_qurt_app_LIBS = atomic rpcmem\n\n# Compiler flags\nlibmy_qurt_app_HEXAGON_CFLAGS = -O2 -Wall\n\n# Link against QuRT\nlibmy_qurt_app_DLLS = libmy_qurt_app_skel\n<\/code><\/pre>\n<p>\u06a9\u06c1 <code>.min<\/code> \u0641\u0627\u0626\u0644 \u06a9\u06cc \u0634\u06a9\u0644 \u06c1\u06cc\u06a9\u0633\u0627\u06af\u0648\u0646 SDK \u06a9\u06d2 SCons \u0628\u0644\u0688 \u0633\u0633\u0679\u0645 \u067e\u0631 \u0645\u0646\u062d\u0635\u0631 \u06c1\u06d2\u06d4 <code>BUILD_LIBS<\/code> \u0644\u0627\u0626\u0628\u0631\u06cc\u0631\u06cc \u06c1\u062f\u0641 \u06a9\u0627 \u0646\u0627\u0645 \u0628\u062a\u0627\u062a\u0627 \u06c1\u06d2\u06d4 <code>C_SRCS<\/code> \u0645\u0627\u062e\u0630 \u0641\u0627\u0626\u0644\u0648\u06ba \u06a9\u06cc \u0641\u06c1\u0631\u0633\u062a \u0628\u0646\u0627\u0626\u06cc\u06ba\u06d4 <code>LIBS<\/code> \u0627\u0633 \u06a9\u06d2 \u062e\u0644\u0627\u0641 \u0644\u0646\u06a9 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0644\u0627\u0626\u0628\u0631\u06cc\u0631\u06cc \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 <code>HEXAGON_CFLAGS<\/code> \u0645\u0631\u062a\u0628 \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u062c\u06be\u0646\u0688\u06d2 \u0645\u0631\u062a\u0628 \u06a9\u0631\u06cc\u06ba\u06d4 <code>DLLS<\/code> \u0645\u0634\u062a\u0631\u06a9\u06c1 \u0644\u0627\u0626\u0628\u0631\u06cc\u0631\u06cc \u0622\u0624\u0679 \u067e\u0679 \u0646\u0627\u0645 \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 <code>_skel<\/code> \u0644\u0627\u062d\u0642\u06d2 DSP \u06a9\u06cc \u0637\u0631\u0641 \u0633\u06d2 \u0646\u0641\u0627\u0630 \u06a9\u06d2 \u0644\u06cc\u06d2 FastRPC \u06a9\u06d2 \u0627\u0635\u0648\u0644 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0627\u0646\u062f\u0631\u0648\u0646\u06cc \u0637\u0648\u0631 \u067e\u0631\u060c SDK <code>SConstruct<\/code> \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u0679\u0631\u06cc \u067e\u0631 \u062c\u0627\u0626\u06cc\u06ba \u0627\u0648\u0631 \u06c1\u0631 \u0645\u0648\u0627\u062f \u06a9\u0648 \u067e\u0691\u06be\u06cc\u06ba\u06d4 <code>.min<\/code> \u0627\u06cc\u06a9 \u0641\u0627\u0626\u0644 \u0628\u0646\u0627\u0626\u06cc\u06ba \u0627\u0648\u0631 \u0627\u0633 \u06a9\u06d2 \u0688\u06cc\u06a9\u0644\u0631\u06cc\u0634\u0646 \u06a9\u0648 SCons \u0628\u0644\u0688 \u0627\u06c1\u062f\u0627\u0641 \u0645\u06cc\u06ba \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u06cc\u06ba\u06d4 \u06a9\u06c1 <code>V<\/code> (\u062a\u0628\u062f\u06cc\u0644\u06cc) \u062c\u0648 \u067e\u06cc\u0631\u0627\u0645\u06cc\u0679\u0631\u0632 \u0622\u067e \u062a\u0639\u0645\u06cc\u0631 \u06a9\u06d2 \u0648\u0642\u062a \u067e\u0627\u0633 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u0648\u06c1 \u0679\u0627\u0631\u06af\u0679 \u0641\u0646 \u062a\u0639\u0645\u06cc\u0631\u060c \u062a\u0639\u0645\u06cc\u0631 \u06a9\u06cc \u0642\u0633\u0645\u060c \u0627\u0648\u0631 \u0679\u0648\u0644 \u0686\u06cc\u0646 \u0648\u0631\u0698\u0646 \u06a9\u0627 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0645\u062b\u0627\u0644 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631\u060c <code>V=hexagon_Release_dynamic_toolv84_v66<\/code> \u0627\u0633 \u06a9\u0627 \u06a9\u06cc\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2: v66 DSP \u0641\u0646 \u062a\u0639\u0645\u06cc\u0631 \u06a9\u0648 \u06c1\u062f\u0641 \u0628\u0646\u0627\u062a\u06d2 \u06c1\u0648\u0626\u06d2 v84 \u0679\u0648\u0644 \u0686\u06cc\u0646 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u0645\u0633\u062f\u0633\u060c \u0631\u06cc\u0644\u06cc\u0632 \u0645\u0648\u0688\u060c \u0688\u0627\u0626\u0646\u0627\u0645\u06a9 \u0644\u0646\u06a9\u0646\u06af \u06a9\u06d2 \u0644\u06cc\u06d2 \u062a\u0639\u0645\u06cc\u0631 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<p>\u0627\u0646 \u0645\u0646\u0635\u0648\u0628\u0648\u06ba \u06a9\u06d2 \u0644\u06cc\u06d2 \u062c\u0646 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u06a9\u0646\u0679\u0631\u0648\u0644 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4 <code>.min<\/code> \u0622\u067e \u0641\u0627\u0631\u0645\u06cc\u0679 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631 \u06a9\u06d2 \u0627\u0633\u0679\u06cc\u0646\u0688 \u0644\u0648\u0646 \u0644\u06a9\u06be \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 <code>SConscript<\/code> \u0641\u0627\u0626\u0644:<\/p>\n<pre><code class=\"language-python\"># SConscript - Standalone SCons build for a QuRT project\n\nImport('env')\n\nenv = env.Clone()\n\n# Add include paths\nenv.Append(CPPPATH = ['inc'])\n\n# Compiler flags\nenv.Append(CCFLAGS = ['-O2', '-Wall'])\n\n# Build the shared library\nsources = ['src\/main.c']\nlibs = ['atomic', 'rpcmem']\n\nenv.SharedLibrary(\n    target=\"libmy_qurt_app_skel\",\n    source = sources,\n    LIBS = libs\n)\n<\/code><\/pre>\n<p>\u06a9\u06c1 <code>SConscript<\/code> \u0646\u0642\u0637\u06c1 \u0646\u0638\u0631 \u0622\u067e \u06a9\u0648 SCons \u062e\u0635\u0648\u0635\u06cc\u0627\u062a \u062a\u06a9 \u0645\u06a9\u0645\u0644 \u0631\u0633\u0627\u0626\u06cc \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0628\u0634\u0645\u0648\u0644 \u0645\u0634\u0631\u0648\u0637 \u062a\u0627\u0644\u06cc\u0641\u060c \u0627\u067e\u0646\u06cc \u0645\u0631\u0636\u06cc \u06a9\u06d2 \u0645\u0637\u0627\u0628\u0642 \u062a\u0639\u0645\u06cc\u0631\u0627\u062a\u06cc \u0627\u0642\u062f\u0627\u0645\u0627\u062a\u060c \u0627\u0646\u062d\u0635\u0627\u0631 \u06a9\u0627 \u067e\u062a\u06c1 \u0644\u06af\u0627\u0646\u06d2\u060c \u0627\u0648\u0631 \u0645\u062e\u062a\u0644\u0641 \u0642\u0633\u0645 \u06a9\u06cc \u062a\u0639\u0645\u06cc\u0631\u06d4 \u06a9\u06c1 <code>Import('env')<\/code> \u06a9\u0627\u0644 \u06a9\u0648 SDK \u06a9\u06d2 \u0627\u0648\u067e\u0631\u06cc \u0633\u0637\u062d \u067e\u0631 \u062a\u0634\u06a9\u06cc\u0644 \u0634\u062f\u06c1 \u0645\u0627\u062d\u0648\u0644 \u0645\u0644 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 <code>SConstruct<\/code>\u06cc\u06c1 \u067e\u06c1\u0644\u06d2 \u06c1\u06cc \u06c1\u06cc\u06a9\u0633\u0627\u06af\u0648\u0646 \u06a9\u0645\u067e\u0627\u0626\u0644\u0631 \u067e\u0627\u062a\u06be\u060c \u06a9\u06cc\u0648 \u0622\u0631 \u0679\u06cc \u06c1\u06cc\u0688\u0631\u0632\u060c \u0627\u0648\u0631 \u0633\u0633\u0679\u0645 \u0644\u0627\u0626\u0628\u0631\u06cc\u0631\u06cc\u0648\u06ba \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u062c\u0627\u0646\u062a\u0627 \u06c1\u06d2\u06d4 <code>env.Clone()<\/code> \u0627\u06cc\u06a9 \u06a9\u0627\u067e\u06cc \u0628\u0646\u0627\u0626\u06cc\u06ba \u062a\u0627\u06a9\u06c1 \u0622\u067e \u06a9\u06cc \u062a\u0631\u0645\u06cc\u0645 \u062f\u0631\u062e\u062a \u06a9\u06d2 \u062f\u0648\u0633\u0631\u06d2 \u0645\u0646\u0635\u0648\u0628\u0648\u06ba \u06a9\u0648 \u0645\u062a\u0627\u062b\u0631 \u0646\u06c1 \u06a9\u0631\u06d2\u06d4<\/p>\n<h2 id=\"heading-the-qurt-programming-model\">QRT \u067e\u0631\u0648\u06af\u0631\u0627\u0645\u0646\u06af \u0645\u0627\u0688\u0644<\/h2>\n<p>QRT \u067e\u0631\u0648\u06af\u0631\u0627\u0645\u0646\u06af \u06a9\u0627 \u0628\u0646\u06cc\u0627\u062f\u06cc \u0630\u06c1\u0646\u06cc \u0645\u0627\u0688\u0644 \u0633\u0627\u062f\u06c1 \u06c1\u06d2\u06d4<\/p>\n<p><strong>\u06a9\u06cc\u0648 \u0622\u0631 \u0679\u06cc \u062a\u0631\u062c\u06cc\u062d\u06cc \u0628\u0646\u06cc\u0627\u062f \u067e\u0631 \u067e\u06cc\u0634\u06af\u06cc \u0622\u0631 \u0679\u06cc \u0627\u0648 \u0627\u06cc\u0633 \u06c1\u06d2\u06d4<\/strong> \u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 \u06a9\u06c1 \u06c1\u0631 \u0686\u06cc\u0632 \u062f\u06be\u0627\u06af\u0648\u06ba \u0645\u06cc\u06ba \u0686\u0644\u062a\u06cc \u06c1\u06d2 (\u06a9\u0648\u0626\u06cc \u0646\u0646\u06af\u06cc \u062f\u06be\u0627\u062a\u06cc \u0645\u06cc\u0646 \u0644\u0648\u067e \u0646\u06c1\u06cc\u06ba)\u06d4 \u0627\u06cc\u06a9 \u0627\u0639\u0644\u06cc \u062a\u0631\u062c\u06cc\u062d\u06cc \u062f\u06be\u0627\u06af\u06c1 \u06c1\u0645\u06cc\u0634\u06c1 \u0628\u063a\u06cc\u0631 \u06a9\u0633\u06cc \u06af\u0641\u062a \u0648 \u0634\u0646\u06cc\u062f \u06a9\u06d2 \u06a9\u0645 \u062a\u0631\u062c\u06cc\u062d\u06cc \u062a\u06be\u0631\u06cc\u0688 \u06a9\u0648 \u0641\u0648\u0631\u06cc \u0637\u0648\u0631 \u067e\u0631 \u067e\u06cc\u0634 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u0633\u06cc \u062a\u0631\u062c\u06cc\u062d\u06cc \u0633\u0637\u062d \u06a9\u06d2 \u062f\u06be\u0627\u06af\u0648\u06ba \u06a9\u0648 \u0631\u0627\u0624\u0646\u0688 \u0631\u0627\u0628\u0646 \u0645\u06cc\u06ba \u0634\u06cc\u0688\u0648\u0644 \u06a9\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0634\u06cc\u0688\u0648\u0644\u0631 \u06a9\u06d2 \u067e\u0627\u0633 \u06a9\u0648\u0626\u06cc \u0679\u06a9 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 \u06a9\u06c1 \u06cc\u06c1 \u0648\u0642\u062a\u0627\u064b \u0641\u0648\u0642\u062a\u0627\u064b \u0646\u06c1\u06cc\u06ba \u0627\u0679\u06be\u062a\u0627\u06d4 \u06cc\u06c1 \u0635\u0631\u0641 \u0627\u0633 \u0648\u0642\u062a \u0686\u0644\u062a\u0627 \u06c1\u06d2 \u062c\u0628 \u0686\u06cc\u0632\u06cc\u06ba \u062a\u0628\u062f\u06cc\u0644 \u06c1\u0648\u062a\u06cc \u06c1\u06cc\u06ba\u060c \u062c\u06cc\u0633\u06d2 \u062a\u06be\u0631\u06cc\u0688 \u06a9\u0648 \u0628\u0644\u0627\u06a9 \u06a9\u0631\u0646\u0627\u060c \u0633\u06af\u0646\u0644 \u0633\u06cc\u0679 \u06a9\u0631\u0646\u0627\u060c \u06cc\u0627 \u0627\u0639\u0644\u06cc \u062a\u0631\u062c\u06cc\u062d\u06cc \u062f\u06be\u0627\u06af\u06c1 \u062a\u06cc\u0627\u0631 \u06a9\u0631\u0646\u0627\u06d4<\/p>\n<pre><code class=\"language-plaintext\">Priority Levels (0-255, lower number = higher priority)\n\n 000  \u2503 \u2588\u2588\u2588\u2588 Interrupt handlers (do not touch this)\n 001  \u2503 \u2588\u2588\u2588\u2588 Critical system tasks\n ...  \u2503\n 064  \u2503 \u2588\u2588\u2588\u2588 Your high-priority audio processing\n ...  \u2503\n 128  \u2503 \u2588\u2588\u2588\u2588 Your medium-priority sensor fusion\n ...  \u2503\n 192  \u2503 \u2588\u2588\u2588\u2588 Your low-priority logging\/reporting\n ...  \u2503\n 255  \u2503 \u2588\u2588\u2588\u2588 Idle thread (QuRT's built-in background)\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u062a\u0631\u062c\u06cc\u062d\u06cc \u0646\u0642\u0634\u06c1 \u062f\u06a9\u06be\u0627\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u06a9\u0633 \u0637\u0631\u062d QRT \u06a9\u06cc 256 \u062a\u0631\u062c\u06cc\u062d\u06cc \u0633\u0637\u062d\u06cc\u06ba \u0639\u0627\u0645 \u0637\u0648\u0631 \u067e\u0631 \u062a\u0641\u0648\u06cc\u0636 \u06a9\u06cc \u062c\u0627\u062a\u06cc \u06c1\u06cc\u06ba\u06d4 \u062a\u0631\u062c\u06cc\u062d 0 \u06c1\u06d2\u06d4 <strong>\u0633\u0628 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1<\/strong> \u062a\u0631\u062c\u06cc\u062d 255 \u06c1\u06d2\u06d4 <strong>\u0633\u0628 \u0633\u06d2 \u06a9\u0645<\/strong>. \u06cc\u06c1 FreeRTOS \u06a9\u06d2 \u0628\u0631\u0639\u06a9\u0633 \u06c1\u06d2\u060c \u062c\u06c1\u0627\u06ba \u0627\u0639\u0644\u06cc \u0646\u0645\u0628\u0631\u0648\u06ba \u06a9\u0648 \u062a\u0631\u062c\u06cc\u062d \u062f\u06cc \u062c\u0627\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u0646\u0679\u0631\u067e\u0679 \u06c1\u06cc\u0646\u0688\u0644\u0631\u0632 \u0633\u0628 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u062a\u0631\u062c\u06cc\u062d\u06cc \u0633\u0637\u062d \u067e\u0631 \u0642\u0627\u0628\u0636 \u06c1\u06cc\u06ba\u060c \u0633\u0633\u0679\u0645 \u06a9\u06d2 \u06a9\u0627\u0645 \u0628\u0627\u0644\u06a9\u0644 \u0646\u06cc\u0686\u06d2 \u06c1\u06cc\u06ba\u060c \u0627\u0648\u0631 \u0635\u0627\u0631\u0641 \u06a9\u06d2 \u062a\u06be\u0631\u06cc\u0688\u0632 \u062f\u0631\u0645\u06cc\u0627\u0646\u06cc \u0631\u06cc\u0646\u062c \u067e\u0631 \u0642\u0627\u0628\u0636 \u06c1\u06cc\u06ba\u06d4 \u062a\u0631\u062c\u06cc\u062d 255 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u06cc\u06a9 \u0628\u06cc\u06a9\u0627\u0631 \u062a\u06be\u0631\u06cc\u0688 \u0635\u0631\u0641 \u0627\u0633 \u0648\u0642\u062a \u0686\u0644\u06d2 \u06af\u0627 \u062c\u0628 \u06a9\u0686\u06be \u0628\u06be\u06cc \u062a\u06cc\u0627\u0631 \u0646\u06c1 \u06c1\u0648\u06d4<\/p>\n<h2 id=\"heading-creating-your-first-qurt-thread\">\u0627\u067e\u0646\u0627 \u067e\u06c1\u0644\u0627 QRT \u062a\u06be\u0631\u06cc\u0688 \u0628\u0646\u0627\u0626\u06cc\u06ba<\/h2>\n<p>\u0633\u0628 \u0633\u06d2 \u0622\u0633\u0627\u0646 QRT \u067e\u0631\u0648\u06af\u0631\u0627\u0645 \u0627\u06cc\u06a9 \u06c1\u06cc \u062a\u06be\u0631\u06cc\u0688 \u06a9\u0648 \u062c\u0646\u0645 \u062f\u06cc\u062a\u0627 \u06c1\u06d2 \u062c\u0648 \u0627\u06cc\u06a9 \u067e\u06cc\u063a\u0627\u0645 \u067e\u0631\u0646\u0679 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0628\u0627\u06c1\u0631 \u0646\u06a9\u0644\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-c\">\/* main.c - First QuRT program *\/\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <qurt.h>\n\n#define STACK_SIZE 4096\n\n\/* Thread stack must be 8-byte aligned *\/\nstatic char thread_stack[STACK_SIZE] __attribute__((aligned(8)));\n\nvoid my_thread_func(void *arg)\n{\n    int thread_id = (int)(uintptr_t)arg;\n\n    printf(\"Hello from QuRT thread %d!n\", thread_id);\n    printf(\"My thread ID: %lun\", qurt_thread_get_id());\n\n    \/* Thread must explicitly exit *\/\n    qurt_thread_exit(QURT_EOK);\n}\n\nint main(void)\n{\n    qurt_thread_t      thread_id;\n    qurt_thread_attr_t attr;\n\n    printf(\"Main thread starting on QuRT!n\");\n\n    \/* Initialize thread attributes *\/\n    qurt_thread_attr_init(&attr);\n\n    \/* Configure the thread *\/\n    qurt_thread_attr_set_name(&attr, \"my_first_thread\");\n    qurt_thread_attr_set_stack_addr(&attr, thread_stack);\n    qurt_thread_attr_set_stack_size(&attr, STACK_SIZE);\n    qurt_thread_attr_set_priority(&attr, 128);  \/* Medium priority *\/\n\n    \/* Create and start the thread *\/\n    int result = qurt_thread_create(&thread_id, &attr,\n                                     my_thread_func,\n                                     (void *)42);\n\n    if (result != QURT_EOK) {\n        printf(\"Thread creation failed with error: %dn\", result);\n        return -1;\n    }\n\n    printf(\"Thread created successfully! ID: %lun\", thread_id);\n\n    \/* Wait for the thread to finish *\/\n    int status;\n    qurt_thread_join(thread_id, &status);\n\n    printf(\"Thread finished with status: %dn\", status);\n    return 0;\n}\n<\/qurt.h><\/stdlib.h><\/stdio.h><\/code><\/pre>\n<p>\u06cc\u06c1 \u067e\u0631\u0648\u06af\u0631\u0627\u0645 QRT \u06a9\u06d2 \u0686\u0627\u0631 \u0645\u0631\u0627\u062d\u0644 \u067e\u0631 \u0645\u0634\u062a\u0645\u0644 \u062a\u06be\u0631\u06cc\u0688 \u0628\u0646\u0627\u0646\u06d2 \u06a9\u06d2 \u0639\u0645\u0644 \u06a9\u0648 \u0638\u0627\u06c1\u0631 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0633\u0628 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 <code>qurt_thread_attr_init()<\/code> \u062f\u06be\u0627\u06af\u06d2 \u06a9\u06cc \u062e\u0635\u0648\u0635\u06cc\u0627\u062a \u06a9\u06cc \u0633\u0627\u062e\u062a \u06a9\u0648 \u0634\u0631\u0648\u0639 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u062f\u0648\u0633\u0631\u0627\u060c \u067e\u0631\u0648\u06af\u0631\u0627\u0645 \u062a\u06be\u0631\u06cc\u0688\u0632 \u06a9\u0648 \u0688\u06cc\u0628\u06af \u0646\u0627\u0645 (\u06a9\u0631\u06cc\u0634 \u0688\u0645\u067e \u0645\u06cc\u06ba \u062f\u06a9\u06be\u0627\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2)\u060c \u0627\u0633\u0679\u06cc\u06a9 \u0627\u06cc\u0688\u0631\u06cc\u0633\u060c \u0627\u0633\u0679\u06cc\u06a9 \u0633\u0627\u0626\u0632\u060c \u0627\u0648\u0631 \u062a\u0631\u062c\u06cc\u062d \u06a9\u06d2 \u0633\u0627\u062a\u06be \u062a\u0631\u062a\u06cc\u0628 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4 \u062a\u06cc\u0633\u0631\u0627 <code>qurt_thread_create()<\/code> \u0641\u0646\u06a9\u0634\u0646 \u067e\u0648\u0627\u0626\u0646\u0679\u0631 \u0627\u0648\u0631 \u0622\u0631\u06af\u06cc\u0648\u0645\u06cc\u0646\u0679\u0633 \u067e\u0627\u0633 \u06a9\u0631\u06a9\u06d2 \u062a\u06be\u0631\u06cc\u0688 \u0628\u0646\u0627\u0626\u06cc\u06ba \u0627\u0648\u0631 \u0627\u0633\u06d2 \u0641\u0648\u0631\u0627\u064b \u0634\u0631\u0648\u0639 \u06a9\u0631\u06cc\u06ba\u06d4 \u0686\u0648\u062a\u06be\u0627\u060c <code>qurt_thread_join()<\/code> \u06a9\u0627\u0644\u0646\u06af \u062a\u06be\u0631\u06cc\u0688 \u06a9\u0648 \u0628\u0644\u0627\u06a9 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0628 \u062a\u06a9 \u06a9\u06c1 \u06a9\u0648\u0626\u06cc \u0646\u06cc\u0627 \u062a\u06be\u0631\u06cc\u0688 \u06a9\u0627\u0644 \u0646\u06c1 \u06a9\u0631\u06d2\u06d4 <code>qurt_thread_exit()<\/code>.<\/p>\n<p>\u062f\u0648 \u062a\u0641\u0635\u06cc\u0644\u0627\u062a \u0627\u06c1\u0645 \u06c1\u06cc\u06ba\u06d4 QRT \u0627\u0633\u0679\u06cc\u06a9 \u0645\u06cc\u0645\u0648\u0631\u06cc \u0645\u062e\u062a\u0635 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 \u06a9\u06c1 \u0622\u067e \u06a9\u0648 \u0627\u06cc\u06a9 \u0645\u0633\u062a\u062d\u06a9\u0645 \u0637\u0648\u0631 \u067e\u0631 \u0645\u062e\u062a\u0635 \u06a9\u0631\u062f\u06c1 8 \u0628\u0627\u0626\u0679 \u0627\u0644\u0627\u0626\u0646\u0645\u0646\u0679 \u0628\u0641\u0631 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u0646\u0627 \u06c1\u0648\u06af\u0627\u06d4 \u0627\u0648\u0631 \u06c1\u0631 \u062a\u06be\u0631\u06cc\u0688 \u06a9\u0648 \u06a9\u0627\u0644 \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2: <code>qurt_thread_exit()<\/code> \u0648\u0627\u067e\u0633\u06cc \u0633\u06d2 \u067e\u06c1\u0644\u06d2\u06d4 \u0627\u06af\u0631 \u06a9\u0648\u0626\u06cc \u062a\u06be\u0631\u06cc\u0688 \u0641\u0646\u06a9\u0634\u0646 \u0635\u0631\u0641 \u0679\u0631\u0645\u06cc\u0646\u06cc\u0634\u0646 \u06a9\u0648 \u06a9\u0627\u0644 \u06a9\u06cc\u06d2 \u0628\u063a\u06cc\u0631 \u0648\u0627\u067e\u0633 \u0622\u062c\u0627\u062a\u0627 \u06c1\u06d2 \u062a\u0648 \u0631\u0648\u06cc\u06d2 \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u0646\u06c1\u06cc\u06ba \u06a9\u06cc \u062c\u0627\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-thread-creation-flow\">\u062f\u06be\u0627\u06af\u06d2 \u06a9\u06cc \u062a\u062e\u0644\u06cc\u0642 \u06a9\u0627 \u0628\u06c1\u0627\u0624<\/h3>\n<pre><code class=\"language-plaintext\">     qurt_thread_attr_init()\n              \u2502\n              \u25bc\n    \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n    \u2502  Set name           \u2502\n    \u2502  Set stack address  \u2502\n    \u2502  Set stack size     \u2502\n    \u2502  Set priority       \u2502\n    \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n              \u2502\n              \u25bc\n     qurt_thread_create()\n              \u2502\n              \u25bc\n    Thread starts running \u2500\u2500\u25ba my_thread_func()\n              \u2502                      \u2502\n              \u25bc                      \u25bc\n     qurt_thread_join()       qurt_thread_exit()\n     (waits for exit)         (signals \"I'm done\")\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u0628\u06c1\u0627\u0624 \u0627\u06cc\u06a9 \u06c1\u06cc \u062f\u06be\u0627\u06af\u06d2 \u06a9\u0627 \u0644\u0627\u0626\u0641 \u0633\u0627\u0626\u06cc\u06a9\u0644 \u062f\u06a9\u06be\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u067e\u0631\u0627\u067e\u0631\u0679\u06cc \u06a9\u0627 \u0688\u06be\u0627\u0646\u0686\u06c1 \u06a9\u0646\u0641\u06cc\u06af\u0631\u06cc\u0634\u0646 \u0622\u0628\u062c\u06cc\u06a9\u0679 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u062a\u0645\u0627\u0645 \u062a\u06be\u0631\u06cc\u0688 \u067e\u06cc\u0631\u0627\u0645\u06cc\u0679\u0631\u0632 \u06a9\u0648 \u0633\u06cc\u0679 \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 \u067e\u06be\u0631 \u0627\u0646 \u06a9\u0648 \u067e\u0627\u0633 \u06a9\u0631\u06cc\u06ba\u06d4 <code>qurt_thread_create()<\/code>. \u062c\u0628 \u06a9\u0648\u0626\u06cc \u062a\u06be\u0631\u06cc\u0688 \u0628\u0646\u062a\u0627 \u06c1\u06d2 \u062a\u0648 \u0648\u06c1 \u062a\u06be\u0631\u06cc\u0688 \u0627\u0646\u0679\u0631\u06cc \u0641\u0646\u06a9\u0634\u0646 \u06a9\u0648 \u0627\u0646\u062c\u0627\u0645 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4 \u062c\u0628 \u0627\u0646\u0679\u0631\u06cc \u0641\u0646\u06a9\u0634\u0646 \u06a9\u0648 \u0628\u0644\u0627\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 <code>qurt_thread_exit()<\/code>\u062a\u06be\u0631\u06cc\u0688 \u062e\u062a\u0645 \u06c1\u0648 \u062c\u0627\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u062a\u0645\u0627\u0645 \u062a\u06be\u0631\u06cc\u0688\u0632 \u0628\u0644\u0627\u06a9 \u06c1\u0648 \u062c\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 <code>qurt_thread_join()<\/code> \u0628\u0644\u0627\u06a9 \u063a\u06cc\u0631 \u0645\u0633\u062f\u0648\u062f \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u06cc\u06af\u0632\u0679 \u0627\u0633\u0679\u06cc\u0679\u0633 \u06a9\u0648\u0688 \u0645\u0648\u0635\u0648\u0644 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-how-thread-creation-works-internally\">\u062f\u06be\u0627\u06af\u06d2 \u06a9\u06cc \u062a\u062e\u0644\u06cc\u0642 \u0627\u0646\u062f\u0631\u0648\u0646\u06cc \u0637\u0648\u0631 \u067e\u0631 \u06a9\u06cc\u0633\u06d2 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4<\/h2>\n<p>\u0632\u06cc\u0627\u062f\u06c1 \u062a\u0631 \u0679\u06cc\u0648\u0679\u0648\u0631\u06cc\u0644\u0632 \u0627\u0633 \u0628\u0627\u062a \u06a9\u0648 \u0686\u06be\u0648\u0691 \u062f\u06cc\u062a\u06d2 \u06c1\u06cc\u06ba \u06a9\u06c1 \u06a9\u06cc\u0627 \u06c1\u0648 \u0631\u06c1\u0627 \u06c1\u06d2\u06d4 <code>qurt_thread_create()<\/code>. \u0627\u0646\u0679\u0631\u0646\u0644 \u06a9\u0648 \u0633\u0645\u062c\u06be\u0646\u0627 \u0688\u06cc\u0628\u06af\u0646\u06af \u0627\u0648\u0631 \u062a\u0631\u062c\u06cc\u062d\u06cc \u0688\u06cc\u0632\u0627\u0626\u0646 \u06a9\u06d2 \u0641\u06cc\u0635\u0644\u0648\u06ba \u06a9\u0648 \u0632\u06cc\u0627\u062f\u06c1 \u0648\u0627\u0636\u062d \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-what-the-kernel-does-during-thread-creation\">\u062f\u06be\u0627\u06af\u06d2 \u06a9\u06cc \u062a\u062e\u0644\u06cc\u0642 \u06a9\u06d2 \u062f\u0648\u0631\u0627\u0646 \u062f\u0627\u0646\u0627 \u06a9\u06cc\u0627 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/h3>\n<p>\u062c\u0628 \u0622\u067e \u06a9\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 <code>qurt_thread_create()<\/code>\u062a\u0645 \u06c1\u0648 <strong>\u0633\u0633\u0679\u0645 \u06a9\u0627\u0644<\/strong> QRT \u062f\u0627\u0646\u0627 \u0645\u06cc\u06ba\u06d4 \u062f\u0627\u0646\u0627 \u062a\u0631\u062a\u06cc\u0628 \u0648\u0627\u0631 \u067e\u0627\u0646\u0686 \u0645\u0631\u0627\u062d\u0644 \u0627\u0646\u062c\u0627\u0645 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-plaintext\">  Your code calls qurt_thread_create()\n         \u2502\n         \u25bc\n  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n  \u2502  1. VALIDATE                                             \u2502\n  \u2502     \u2022 Is the stack pointer non-NULL and aligned?         \u2502\n  \u2502     \u2022 Is the stack size >= minimum (typ. 2KB)?           \u2502\n  \u2502     \u2022 Is the priority in range 0-255?                    \u2502\n  \u2502     \u2022 Is the entry function pointer non-NULL?            \u2502\n  \u2502     (If any check fails \u2192 return QURT_EINVALID)          \u2502\n  \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n  \u2502  2. ALLOCATE THREAD CONTROL BLOCK (TCB)                  \u2502\n  \u2502     \u2022 QuRT allocates a kernel-side data structure        \u2502\n  \u2502     \u2022 This holds: thread ID, priority, state, saved      \u2502\n  \u2502       registers, signal masks, mutex wait list, etc.     \u2502\n  \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n  \u2502  3. INITIALIZE THE STACK FRAME                           \u2502\n  \u2502     \u2022 The kernel sets up a synthetic stack frame at the  \u2502\n  \u2502       top of YOUR stack memory                           \u2502\n  \u2502     \u2022 It writes the initial register values:             \u2502\n  \u2502       \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510           \u2502\n  \u2502       \u2502  Stack Top (high address)            \u2502           \u2502\n  \u2502       \u2502  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u2502           \u2502\n  \u2502       \u2502  \u2502 PC  = my_thread_func (entry)     \u2502\u2502           \u2502\n  \u2502       \u2502  \u2502 SP  = stack_addr + stack_size    \u2502\u2502           \u2502\n  \u2502       \u2502  \u2502 R0  = arg (your void* argument)  \u2502\u2502           \u2502\n  \u2502       \u2502  \u2502 LR  = qurt_thread_exit           \u2502\u2502           \u2502\n  \u2502       \u2502  \u2502 SR  = default status register    \u2502\u2502           \u2502\n  \u2502       \u2502  \u2502 R1-R31 = 0                       \u2502\u2502           \u2502\n  \u2502       \u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u2502            \u2502\n  \u2502       \u2502  ... (rest of stack is untouched) ...\u2502           \u2502\n  \u2502       \u2502  Stack Bottom (low address)          \u2502           \u2502\n  \u2502       \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518           \u2502\n  \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n  \u2502  4. INSERT INTO READY QUEUE                              \u2502\n  \u2502     \u2022 The TCB is added to the scheduler's ready queue    \u2502\n  \u2502       at the appropriate priority level                  \u2502\n  \u2502     \u2022 The thread's state is set to READY                 \u2502\n  \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n  \u2502  5. TRIGGER A RESCHEDULE                                 \u2502\n  \u2502     \u2022 The scheduler checks: \"Is this new thread's        \u2502\n  \u2502       priority higher than the currently running         \u2502\n  \u2502       thread?\"                                           \u2502\n  \u2502     \u2022 If YES: context switch happens RIGHT NOW           \u2502\n  \u2502       (the calling thread is preempted)                  \u2502\n  \u2502     \u2022 If NO: the new thread waits in the ready queue     \u2502\n  \u2502       until it's the highest priority runnable thread    \u2502\n  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n         \u2502\n         \u25bc\n  qurt_thread_create() returns to the caller\n  (but the new thread may already be running!)\n<\/code><\/pre>\n<p>\u0627\u0633 \u0628\u06c1\u0627\u0624 \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u0633\u0628 \u0633\u06d2 \u062d\u06cc\u0631\u0627\u0646 \u06a9\u0646 \u0686\u06cc\u0632 \u0645\u0631\u062d\u0644\u06c1 5 \u06c1\u06d2\u06d4 \u0627\u06af\u0631 \u0646\u0626\u06d2 \u062a\u06be\u0631\u06cc\u0688 \u06a9\u06cc \u062a\u0631\u062c\u06cc\u062d \u0627\u0633 \u062a\u06be\u0631\u06cc\u0688 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u06c1\u06d2 \u062c\u0633 \u0646\u06d2 \u0627\u0633\u06d2 \u0628\u0646\u0627\u06cc\u0627 \u06c1\u06d2\u060c <strong>\u0627\u0633 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0627\u06cc\u06a9 \u0646\u06cc\u0627 \u062a\u06be\u0631\u06cc\u0688 \u0634\u0631\u0648\u0639 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4<\/strong> <code>qurt_thread_create()<\/code> <strong>\u06a9\u0627\u0644\u0631 \u067e\u0631 \u0648\u0627\u067e\u0633 \u062c\u0627\u0626\u06cc\u06ba<\/strong>. \u062a\u062e\u0644\u06cc\u0642 \u06a9\u0627 \u062f\u06be\u0627\u06af\u06c1 \u06a9\u0627\u0644 \u06a9\u06d2 \u062f\u0648\u0631\u0627\u0646 \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u062a\u06cc\u0627\u0631 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0648\u06c1\u06cc \u06c1\u06d2 \u062c\u0648 &quot;\u0642\u0628\u0644 \u0627\u0632 \u0648\u0642\u062a&#8221; \u06a9\u0627 \u0627\u0635\u0644 \u0645\u0637\u0644\u0628 \u06c1\u06d2\u06d4 \u0634\u06cc\u0688\u0648\u0644\u0631 \u06a9\u0633\u06cc \u0622\u0633\u0627\u0646 \u0644\u0645\u062d\u06d2 \u06a9\u0627 \u0627\u0646\u062a\u0638\u0627\u0631 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0641\u0648\u0631\u06cc \u0637\u0648\u0631 \u067e\u0631 \u062a\u0631\u062c\u06cc\u062d\u0627\u062a \u06a9\u0627 \u0627\u0637\u0644\u0627\u0642 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-how-the-stack-frame-launches-your-function\">\u0627\u0633\u0679\u06cc\u06a9 \u0641\u0631\u06cc\u0645 \u0627\u06cc\u06a9 \u0641\u0646\u06a9\u0634\u0646 \u06a9\u0648 \u06a9\u06cc\u0633\u06d2 \u0634\u0631\u0648\u0639 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/h3>\n<p>\u062c\u0628 \u0634\u06cc\u0688\u06cc\u0648\u0644\u0631 \u0633\u06cc\u0627\u0642 \u0648 \u0633\u0628\u0627\u0642 \u067e\u06c1\u0644\u06cc \u0628\u0627\u0631 \u06a9\u0633\u06cc \u0646\u0626\u06d2 \u062a\u06be\u0631\u06cc\u0688 \u067e\u0631 \u0633\u0648\u0626\u0686 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u06cc\u06c1 \u0628\u0627\u0644\u06a9\u0644 \u0648\u06c1\u06cc \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0648 \u062a\u0645\u0627\u0645 \u0633\u06cc\u0627\u0642 \u0648 \u0633\u0628\u0627\u0642 \u06a9\u06d2 \u0633\u0648\u0626\u0686\u0632 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u0639\u0646\u06cc\u060c \u06cc\u06c1 TCB \u0645\u06cc\u06ba \u0645\u062d\u0641\u0648\u0638 \u0634\u062f\u06c1 \u0631\u062c\u0633\u0679\u0631\u0648\u06ba \u06a9\u0648 \u0628\u062d\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0645\u062d\u0641\u0648\u0638 \u0634\u062f\u06c1 \u067e\u0631\u0648\u06af\u0631\u0627\u0645 \u06a9\u0627\u0624\u0646\u0679\u0631 \u067e\u0631 \u0686\u06be\u0644\u0627\u0646\u06af \u0644\u06af\u0627 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u06cc\u06a9 \u0646\u0626\u06d2 \u062f\u06be\u0627\u06af\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2\u060c \u0627\u0633 \u06a9\u06d2 \u0631\u062c\u0633\u0679\u0631 \u06a9\u0648 \u062f\u0627\u0646\u0627 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0645\u0631\u062d\u0644\u06c1 3 \u0645\u06cc\u06ba \u062c\u0627\u0645\u0639 \u0637\u0648\u0631 \u067e\u0631 \u062a\u0631\u062a\u06cc\u0628 \u062f\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4 <strong>\u067e\u06cc \u0633\u06cc (\u067e\u0631\u0648\u06af\u0631\u0627\u0645 \u06a9\u0627\u0624\u0646\u0679\u0631)<\/strong> \u067e\u0631 \u0645\u0642\u0631\u0631 \u06c1\u06d2 <code>my_thread_func<\/code>\u067e\u0631\u0648\u0633\u06cc\u0633\u0631 \u0627\u0633 \u0641\u0646\u06a9\u0634\u0646 \u0645\u06cc\u06ba \u0686\u06be\u0644\u0627\u0646\u06af \u0644\u06af\u0627\u062a\u0627 \u06c1\u06d2\u06d4 <strong>R0<\/strong> \u0622\u067e \u06a9\u06d2 \u0644\u0626\u06d2 \u0645\u0642\u0631\u0631 <code>arg<\/code> \u0686\u0648\u0646\u06a9\u06c1 \u06cc\u06c1 \u0627\u06cc\u06a9 \u067e\u06cc\u0631\u0627\u0645\u06cc\u0679\u0631 \u06c1\u06d2\u060c \u0627\u0633 \u0644\u06cc\u06d2 \u0641\u0646\u06a9\u0634\u0646 \u0627\u0633\u06d2 \u067e\u06c1\u0644\u06cc \u062f\u0644\u06cc\u0644 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0644\u06cc\u062a\u0627 \u06c1\u06d2 (\u06c1\u06cc\u06a9\u0633\u0627\u06af\u0648\u0646 \u06a9\u0627\u0644\u0646\u06af \u06a9\u0646\u0648\u0646\u0634\u0646 \u06a9\u06d2 \u0645\u0637\u0627\u0628\u0642)\u06d4 \u06a9\u06c1 <strong>\u0627\u06cc\u0633 \u067e\u06cc (\u0627\u0633\u0679\u06cc\u06a9 \u067e\u0648\u0627\u0626\u0646\u0679\u0631)<\/strong> \u06cc\u06c1 \u0627\u0633\u0679\u06cc\u06a9 \u06a9\u06d2 \u0627\u0648\u067e\u0631\u06cc \u062d\u0635\u06d2 \u067e\u0631 \u0633\u06cc\u0679 \u06c1\u06d2\u060c \u0627\u0633 \u0644\u06cc\u06d2 \u0641\u0646\u06a9\u0634\u0646 \u0645\u06cc\u06ba \u06a9\u0627\u0645 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u0627\u0633\u0679\u06cc\u06a9 \u06c1\u06d2\u06d4 \u0627\u0648\u0631 <strong>LR (\u0644\u0646\u06a9 \u0631\u062c\u0633\u0679\u0631)<\/strong> \u067e\u0631 \u0645\u0642\u0631\u0631 \u06c1\u06d2 <code>qurt_thread_exit<\/code>\u0644\u06c1\u0630\u0627 \u0627\u06af\u0631 \u0641\u0646\u06a9\u0634\u0646 \u0639\u0627\u0645 \u0637\u0648\u0631 \u067e\u0631 \u0648\u0627\u067e\u0633 \u0622\u062a\u0627 \u06c1\u06d2 (\u062c\u0633 \u067e\u0631 \u0622\u067e \u06a9\u0648 \u0628\u06be\u0631\u0648\u0633\u06c1 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u0626\u06d2) \u062a\u0648 \u0622\u06af\u06d2 \u0628\u0691\u06be\u06cc\u06ba\u06d4 <code>qurt_thread_exit<\/code>.<\/p>\n<pre><code class=\"language-plaintext\">The illusion:\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nTo your thread function, it looks like someone\n\"called\" it normally with the argument you passed.\n\nThe reality:\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nThe scheduler restored a set of synthetic registers\nthat make the processor THINK it is returning from\na function call into your entry point.\n\nIt's like waking up in a room you have never been in,\nbut someone arranged everything so perfectly that\nyou do not realize you did not walk in through the door.\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u062e\u0627\u06a9\u06c1 \u067e\u0631\u0648\u06af\u0631\u0627\u0645\u0631 \u06a9\u06d2 \u062f\u0645\u0627\u063a\u06cc \u0645\u0627\u0688\u0644 (\u0627\u06cc\u06a9 \u0639\u0627\u0645 \u0641\u0646\u06a9\u0634\u0646 \u06a9\u0627\u0644) \u0633\u06d2 \u0645\u062a\u0635\u0627\u062f\u0645 \u06c1\u06d2 \u062c\u0648 \u0627\u0635\u0644 \u0645\u06cc\u06ba \u06c1\u0627\u0631\u0688 \u0648\u06cc\u0626\u0631 \u06a9\u06cc \u0633\u0637\u062d \u067e\u0631 \u06c1\u0648\u062a\u0627 \u06c1\u06d2 (\u0631\u062c\u0633\u0679\u0631 \u0631\u06cc\u0633\u0679\u0648\u0631\u06cc\u0634\u0646 \u0627\u06cc\u06a9 \u0641\u0646\u06a9\u0634\u0646 \u06a9\u0627\u0644 \u06a9\u06cc \u0646\u0642\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2)\u06d4 \u062a\u06be\u0631\u06cc\u0688 \u0641\u0646\u06a9\u0634\u0646\u0632 \u06a9\u06d2 \u067e\u0627\u0633 \u0627\u0646 \u062f\u0648 \u0645\u0646\u0638\u0631\u0646\u0627\u0645\u0648\u06ba \u0645\u06cc\u06ba \u0641\u0631\u0642 \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u06a9\u0648\u0626\u06cc \u0637\u0631\u06cc\u0642\u06c1 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0628\u0627\u0644\u06a9\u0644 \u0646\u0642\u0637\u06c1 \u06c1\u06d2. \u062f\u0627\u0646\u0627 \u06a9\u0645\u0627\u0644 \u06a9\u0627 \u0648\u06c1\u0645 \u067e\u06cc\u062f\u0627 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-context-switch-walkthrough\">\u0633\u06cc\u0627\u0642 \u0648 \u0633\u0628\u0627\u0642 \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0645\u0634\u0642<\/h3>\n<p>\u0627\u06cc\u06a9 \u0645\u062e\u0635\u0648\u0635 \u0645\u062b\u0627\u0644 \u067e\u0631 \u063a\u0648\u0631 \u06a9\u0631\u06cc\u06ba\u06d4 \u062a\u06be\u0631\u06cc\u0688 A (\u062a\u0631\u062c\u06cc\u062d 128) \u062a\u06be\u0631\u06cc\u0688 B (\u062a\u0631\u062c\u06cc\u062d 64\u060c \u062c\u0648 \u0627\u06cc\u06a9 \u0627\u0639\u0644\u06cc \u062a\u0631\u062c\u06cc\u062d \u06c1\u06d2) \u06a9\u0648 \u062c\u0646\u0645 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4 \u062f\u0631\u062c \u0630\u06cc\u0644 \u0679\u0627\u0626\u0645 \u0644\u0627\u0626\u0646 \u062f\u06a9\u06be\u0627\u062a\u06cc \u06c1\u06d2 \u06a9\u06c1 \u06c1\u0631 \u0642\u062f\u0645 \u0645\u06cc\u06ba \u06a9\u06cc\u0627 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-plaintext\">Time \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25ba\n\nThread A (pri 128)          Kernel\/Scheduler         Thread B (pri 64)\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500           \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500           \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nCalls                      \nqurt_thread_create()       \n   \u2502                       \n   \u251c\u2500\u25ba System call \u2500\u2500\u2500\u2500\u2500\u2500\u25ba  Validates params\n                            Allocates TCB\n                            Sets up stack frame\n                            Inserts B into ready queue\n                            \n                            \"B (64) > A (128)?  YES.\"\n                            \n                            SAVE A's registers   \u2500\u2500\u2510\n                            to A's TCB             \u2502\n                                                   \u2502\n                            LOAD B's registers   \u25c4\u2500\u2518\n                            from B's TCB (the\n                            synthetic ones)\n                            \n                            Jump to PC \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25ba my_thread_func(arg)\n                                                   \u2502\n                                                   \u2502 does work...\n                                                   \u2502 calls qurt_thread_exit()\n                                                   \u2502\n                            B is removed \u25c4\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Exit system call\n                            from ready queue\n                            \n                            \"Who's next? A.\"\n                            \n                            LOAD A's registers\n   \u2502                        Jump to A's PC\n   \u2502\u25c4\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n   \u2502\n   \u251c\u2500\u25ba qurt_thread_create()\n   \u2502   returns QURT_EOK\n   \u2502\n   \u25bc continues...\n<\/code><\/pre>\n<p>\u062a\u06be\u0631\u06cc\u0688 \u0627\u06d2 \u06a9\u06d2 \u0646\u0642\u0637\u06c1 \u0646\u0638\u0631 \u0633\u06d2: <code>qurt_thread_create()<\/code> \u06cc\u06c1 \u0635\u0631\u0641 \u0627\u06cc\u06a9 \u0641\u0646\u06a9\u0634\u0646 \u06a9\u0627\u0644 \u06c1\u06d2 \u062c\u0633\u06d2 \u0648\u0627\u067e\u0633 \u0622\u0646\u06d2 \u0645\u06cc\u06ba \u0648\u0642\u062a \u0644\u06af\u062a\u0627 \u06c1\u06d2\u06d4 \u062a\u06be\u0631\u06cc\u0688 \u0627\u06d2 \u06a9\u0648 \u06a9\u0648\u0626\u06cc \u0627\u0646\u062f\u0627\u0632\u06c1 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2 \u06a9\u06c1 \u06cc\u06c1 \u0645\u0639\u0637\u0644 \u06c1\u06d2\u06d4 \u0627\u0633 \u0648\u0642\u0641\u06d2 \u06a9\u06d2 \u062f\u0648\u0631\u0627\u0646\u060c \u0622\u067e \u06a9\u0648 \u0645\u0639\u0644\u0648\u0645 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u06af\u0627 \u06a9\u06c1 \u062a\u06be\u0631\u06cc\u0688 \u0628\u06cc \u067e\u06c1\u0644\u06d2 \u06c1\u06cc \u0686\u0644 \u0686\u06a9\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0645\u06a9\u0645\u0644 \u06c1\u0648 \u0686\u06a9\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0634\u06cc\u0688\u06cc\u0648\u0644\u0631 \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u062a\u06cc\u0627\u0631 \u06a9\u0631\u062f\u06c1 \u062f\u06be\u0627\u06af\u0648\u06ba \u06a9\u0648 \u063a\u06cc\u0631 \u0645\u0631\u0626\u06cc \u0628\u0646\u0627 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0642\u0628\u0644 \u0627\u0632 \u0648\u0642\u062a \u0634\u06cc\u0688\u0648\u0644\u0646\u06af \u06a9\u06cc \u0627\u06cc\u06a9 \u0628\u0646\u06cc\u0627\u062f\u06cc \u062e\u0627\u0635\u06cc\u062a \u06c1\u06d2\u06d4 \u062f\u06be\u0627\u06af\u0648\u06ba \u06a9\u0648 \u0627\u06cc\u06a9 \u062f\u0648\u0633\u0631\u06d2 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u062a\u0639\u0627\u0648\u0646 \u06a9\u0631\u0646\u06d2 \u06cc\u0627 \u0627\u06cc\u06a9 \u062f\u0648\u0633\u0631\u06d2 \u06a9\u06d2 \u0648\u062c\u0648\u062f \u0633\u06d2 \u0622\u06af\u0627\u06c1 \u06c1\u0648\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-thread-control-block-contents\">\u062a\u06be\u0631\u06cc\u0688 \u06a9\u0646\u0679\u0631\u0648\u0644 \u0628\u0644\u0627\u06a9 \u0645\u0634\u0645\u0648\u0644\u0627\u062a<\/h3>\n<p>TCB \u06c1\u0631 \u062a\u06be\u0631\u06cc\u0688 \u06a9\u0648 \u0679\u0631\u06cc\u06a9 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062f\u0627\u0646\u0627 \u06a9\u0627 \u0627\u0646\u062f\u0631\u0648\u0646\u06cc \u0688\u06cc\u0679\u0627 \u0688\u06be\u0627\u0646\u0686\u06c1 \u06c1\u06d2\u06d4 \u0627\u06af\u0631\u0686\u06c1 \u06cc\u06c1 \u0628\u0631\u0627\u06c1 \u0631\u0627\u0633\u062a \u0642\u0627\u0628\u0644 \u0631\u0633\u0627\u0626\u06cc \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u0627\u0633 \u06a9\u06d2 \u0645\u0648\u0627\u062f \u06a9\u0648 \u0633\u0645\u062c\u06be\u0646\u0627 QRT \u06a9\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u062a\u0631 \u0631\u0648\u06cc\u06d2 \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u06a9\u0631 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-c\">\/* Conceptual TCB layout (simplified, not actual QuRT source) *\/\nstruct qurt_tcb {\n    \/* Identity *\/\n    qurt_thread_t   thread_id;\n    char            name[16];\n    \n    \/* Scheduling *\/\n    uint8_t         base_priority;\n    uint8_t         effective_priority; \/* May differ due to priority inheritance *\/\n    uint8_t         state;             \/* READY, RUNNING, BLOCKED, SUSPENDED *\/\n    \n    \/* Saved CPU context (filled during context switch) *\/\n    uint32_t        saved_regs[32];\n    uint32_t        saved_pc;\n    uint32_t        saved_sp;\n    uint32_t        saved_sr;\n    \n    \/* Stack info (for debugging and overflow detection) *\/\n    void           *stack_base;\n    size_t          stack_size;\n    \n    \/* Blocking info *\/\n    void           *wait_object;  \/* Mutex\/signal\/pipe being waited on *\/\n    uint32_t        wait_mask;    \/* Signal bits being waited for *\/\n    \n    \/* Linked list pointers *\/\n    struct qurt_tcb *next_ready;\n    struct qurt_tcb *next_waiting;\n    \n    \/* Join support *\/\n    int             exit_status;  \/* Value passed to qurt_thread_exit() *\/\n    qurt_thread_t   joiner;      \/* Thread waiting in qurt_thread_join() *\/\n};\n<\/code><\/pre>\n<p>TCB \u0634\u06cc\u0688\u06cc\u0648\u0644\u0631 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062f\u0631\u06a9\u0627\u0631 \u06c1\u0631 \u0686\u06cc\u0632 \u06a9\u0648 \u0627\u0633\u0679\u0648\u0631 \u06a9\u0631\u062a\u0627 \u06c1\u06d2: \u0634\u0646\u0627\u062e\u062a \u06a9\u06cc \u0645\u0639\u0644\u0648\u0645\u0627\u062a (\u062a\u06be\u0631\u06cc\u0688 \u0622\u0626\u06cc \u0688\u06cc \u0627\u0648\u0631 \u0688\u06cc\u0628\u06af \u06a9\u0627 \u0646\u0627\u0645)\u060c \u0646\u0638\u0627\u0645 \u0627\u0644\u0627\u0648\u0642\u0627\u062a (\u0628\u0646\u06cc\u0627\u062f \u0627\u0648\u0631 \u0645\u0648\u062b\u0631 \u062a\u0631\u062c\u06cc\u062d\u0627\u062a\u060c \u0645\u0648\u062c\u0648\u062f\u06c1 \u062d\u0627\u0644\u062a)\u060c \u0645\u062d\u0641\u0648\u0638 \u06a9\u0631\u062f\u06c1 \u0633\u06cc \u067e\u06cc \u06cc\u0648 \u0633\u06cc\u0627\u0642 \u0648 \u0633\u0628\u0627\u0642 (\u062a\u0645\u0627\u0645 32 \u0639\u0627\u0645 \u0645\u0642\u0635\u062f \u06a9\u06d2 \u0631\u062c\u0633\u0679\u0631 \u067e\u0644\u0633 \u067e\u06cc \u0633\u06cc\u060c \u0627\u06cc\u0633 \u067e\u06cc\u060c \u0627\u0648\u0631 \u0627\u0633\u0679\u06cc\u0679\u0633 \u0631\u062c\u0633\u0679\u0631)\u060c \u0627\u0633\u0679\u06cc\u06a9 \u0628\u0627\u0624\u0646\u0688\u0631\u06cc\u0632\u060c \u0628\u0644\u0627\u06a9\u0646\u06af \u0627\u0646\u0641\u0627\u0631\u0645\u06cc\u0634\u0646 (\u06a9\u06cc\u0627 \u06c1\u06d2)\u060c \u062a\u06be\u0631\u06cc\u0688 \u0645\u06cc\u06ba \u0634\u0627\u0645\u0644 \u06c1\u0648\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062a\u06cc\u0627\u0631 \u067e\u0648\u0627\u0626\u0646\u0679\u0633 \u0627\u0648\u0631 \u0648\u06cc\u0679\u0646\u06af \u067e\u0648\u0627\u0626\u0646\u0679\u0633 \u06a9\u0627 \u0627\u0646\u062a\u0638\u0627\u0631 \u06a9\u0631\u0646\u0627 \u06a9\u06be\u06cc\u062a\u0648\u06ba<\/p>\n<p>\u06a9\u06c1 <code>effective_priority<\/code> \u0641\u06cc\u0644\u0688\u0632 \u0645\u062e\u062a\u0644\u0641 \u06c1\u0648 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 <code>base_priority<\/code> \u0627\u06af\u0631 \u062a\u0631\u062c\u06cc\u062d\u06cc \u0648\u0631\u0627\u062b\u062a \u0641\u0639\u0627\u0644 \u06c1\u06d2\u060c \u062a\u0648 \u06cc\u06c1 \u0645\u0637\u0627\u0628\u0642\u062a \u067e\u0630\u06cc\u0631\u06cc \u0633\u06cc\u06a9\u0634\u0646 \u0645\u06cc\u06ba \u0634\u0627\u0645\u0644 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-thread-state-machine\">\u062a\u06be\u0631\u06cc\u0688 \u0633\u0679\u06cc\u0679 \u0645\u0634\u06cc\u0646<\/h3>\n<p>\u0627\u06cc\u06a9 QRT \u062f\u06be\u0627\u06af\u06c1 \u06c1\u0645\u06cc\u0634\u06c1 \u0686\u0627\u0631 \u062d\u0627\u0644\u062a\u0648\u06ba \u0645\u06cc\u06ba \u0633\u06d2 \u0627\u06cc\u06a9 \u0645\u06cc\u06ba \u06c1\u0648\u062a\u0627 \u06c1\u06d2:<\/p>\n<pre><code class=\"language-plaintext\">                    qurt_thread_create()\n                           \u2502\n                           \u25bc\n                    \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n          \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502  READY   \u2502\u25c4\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n          \u2502         \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518                           \u2502\n          \u2502              \u2502 \u25b2                               \u2502\n          \u2502  Scheduler   \u2502 \u2502 Preempted by                  \u2502\n          \u2502  picks this  \u2502 \u2502 higher-priority               \u2502\n          \u2502  thread      \u2502 \u2502 thread                        \u2502\n          \u2502              \u25bc \u2502                               \u2502\n          \u2502         \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510     Signal\/mutex\/         \u2502\n          \u2502         \u2502 RUNNING  \u2502     timer event           \u2502\n          \u2502         \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518     unblocks thread       \u2502\n          \u2502              \u2502                                 \u2502\n          \u2502  Thread calls\u2502                                 \u2502\n          \u2502  blocking    \u2502                                 \u2502\n          \u2502  API:        \u2502                                 \u2502\n          \u2502  - mutex_lock\u2502                                 \u2502\n          \u2502  - signal_   \u2502                                 \u2502\n          \u2502    wait      \u2502                                 \u2502\n          \u2502  - pipe_     \u2502                                 \u2502\n          \u2502    receive   \u25bc                                 \u2502\n          \u2502         \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510                           \u2502\n          \u2502         \u2502 BLOCKED  \u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n          \u2502         \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n          \u2502\n          \u2502  qurt_thread_exit()\n          \u2502         \u2502\n          \u2502         \u25bc\n          \u2502    \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n          \u2514\u2500\u2500\u2500\u25ba\u2502  DEAD    \u2502\n               \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n<\/code><\/pre>\n<ul>\n<li>\n<p><strong>\u062a\u06cc\u0627\u0631<\/strong> \u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 \u06a9\u06c1 \u062a\u06be\u0631\u06cc\u0688 \u0686\u0644 \u0633\u06a9\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u06c1\u0627\u0631\u0688 \u0648\u06cc\u0626\u0631 \u062a\u06be\u0631\u06cc\u0688 \u0633\u0644\u0627\u0679 \u06a9\u0627 \u0627\u0646\u062a\u0638\u0627\u0631 \u06a9\u0631 \u0631\u06c1\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p><strong>\u0686\u0644 \u0631\u06c1\u0627 \u06c1\u06d2<\/strong> \u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 \u06a9\u06c1 \u062f\u06be\u0627\u06af\u06c1 \u0641\u06cc \u0627\u0644\u062d\u0627\u0644 \u06c1\u0627\u0631\u0688\u0648\u06cc\u0626\u0631 \u062a\u06be\u0631\u06cc\u0688 \u067e\u0631 \u0686\u0644 \u0631\u06c1\u0627 \u06c1\u06d2 (\u0627\u06cc\u06a9 \u0648\u0642\u062a \u0645\u06cc\u06ba \u0635\u0631\u0641 \u0627\u06cc\u06a9 \u062f\u06be\u0627\u06af\u06c1 \u0641\u06cc \u06c1\u0627\u0631\u0688 \u0648\u06cc\u0626\u0631 \u062a\u06be\u0631\u06cc\u0688 \u0633\u0644\u0627\u0679 \u0627\u0633 \u062d\u0627\u0644\u062a \u0645\u06cc\u06ba \u06c1\u06d2)\u06d4<\/p>\n<\/li>\n<li>\n<p><strong>\u0645\u0633\u062f\u0648\u062f<\/strong> \u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 \u06a9\u06c1 \u062a\u06be\u0631\u06cc\u0688 \u06a9\u0633\u06cc \u0628\u06cc\u0631\u0648\u0646\u06cc \u0627\u06cc\u0648\u0646\u0679 \u06a9\u0627 \u0627\u0646\u062a\u0638\u0627\u0631 \u06a9\u0631 \u0631\u06c1\u0627 \u06c1\u06d2 (\u0645\u06cc\u0648\u0679\u06cc\u06a9\u0633 \u062c\u0627\u0631\u06cc \u06a9\u0631\u06cc\u06ba\u060c \u0633\u06af\u0646\u0644 \u0633\u06cc\u0679 \u06a9\u0631\u06cc\u06ba\u060c \u0679\u0627\u0626\u0645\u0631 \u062e\u062a\u0645 \u06a9\u0631\u06cc\u06ba)\u06d4<\/p>\n<\/li>\n<li>\n<p><strong>\u0645\u0631\u062f\u06c1<\/strong> \u0627\u0633 \u0633\u06d2 \u0645\u0631\u0627\u062f \u0648\u06c1 \u062f\u06be\u0627\u06af\u06c1 \u06c1\u06d2 \u062c\u0633 \u0633\u06d2 \u0627\u0633\u06d2 \u0628\u0644\u0627\u06cc\u0627 \u06af\u06cc\u0627 \u062a\u06be\u0627\u06d4 <code>qurt_thread_exit()<\/code>. \u062c\u0628 \u06a9\u0633\u06cc \u0627\u0648\u0631 \u062a\u06be\u0631\u06cc\u0688 \u06a9\u0648 \u0628\u0644\u0627\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 <code>qurt_thread_join()<\/code> \u0627\u0633 \u062a\u06be\u0631\u06cc\u0688 \u06a9\u0648 \u067e\u06be\u0631 \u0627\u06cc\u06af\u0632\u0679 \u0627\u0633\u0679\u06cc\u0679\u0633 \u0645\u0644\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<\/ul>\n<h3 id=\"heading-hardware-thread-slots\">\u06c1\u0627\u0631\u0688 \u0648\u06cc\u0626\u0631 \u062f\u06be\u0627\u06af\u06d2 \u06a9\u06cc \u0633\u0644\u0627\u0679<\/h3>\n<p>\u0645\u0633\u062f\u0633 \u0688\u06cc \u0627\u06cc\u0633 \u067e\u06cc <strong>\u06c1\u0627\u0631\u0688 \u0648\u06cc\u0626\u0631 \u0645\u0644\u0679\u06cc \u062a\u06be\u0631\u06cc\u0688 \u067e\u0631\u0648\u0633\u06cc\u0633\u0631<\/strong> \u06c1\u0631 \u06a9\u0648\u0631 \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u06c1\u0627\u0631\u0688 \u0648\u06cc\u0626\u0631 \u062a\u06be\u0631\u06cc\u0688 \u0633\u0644\u0627\u0679 \u06c1\u06cc\u06ba (\u0639\u0627\u0645 \u0637\u0648\u0631 \u067e\u0631 2 \u0633\u06d2 4)\u06d4 \u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u06a9\u06cc\u0648 \u0622\u0631 \u0679\u06cc \u0635\u0631\u0641 \u0679\u0627\u0626\u0645 \u0633\u0644\u0627\u0626\u0633\u0646\u06af \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u0627\u06cc\u06a9 \u06c1\u06cc \u06a9\u0648\u0631 \u067e\u0631 \u0645\u062a\u0639\u062f\u062f \u062a\u06be\u0631\u06cc\u0688\u0632 \u06a9\u0648 \u0628\u06cc\u06a9 \u0648\u0642\u062a \u0686\u0644\u0627 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-plaintext\">\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502          Hexagon DSP Core               \u2502\n\u2502                                         \u2502\n\u2502  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510           \u2502\n\u2502  \u2502 HW Thread \u2502  \u2502 HW Thread \u2502           \u2502\n\u2502  \u2502 Slot 0    \u2502  \u2502 Slot 1    \u2502  ...      \u2502\n\u2502  \u2502           \u2502  \u2502           \u2502           \u2502\n\u2502  \u2502 Thread A  \u2502  \u2502 Thread B  \u2502           \u2502\n\u2502  \u2502 (running) \u2502  \u2502 (running) \u2502           \u2502\n\u2502  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518           \u2502\n\u2502                                         \u2502\n\u2502  Ready Queue: [C, D, E, F, ...]         \u2502\n\u2502  The scheduler fills HW slots with      \u2502\n\u2502  the highest-priority READY threads     \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u062e\u0627\u06a9\u06c1 \u0627\u06cc\u06a9 \u06c1\u06cc\u06a9\u0633\u0627\u06af\u0648\u0646\u0644 \u06a9\u0648\u0631 \u06a9\u0648 \u062f\u0648 \u06c1\u0627\u0631\u0688\u0648\u06cc\u0626\u0631 \u062a\u06be\u0631\u06cc\u0688 \u0633\u0644\u0627\u0679\u0633 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u062f\u06a9\u06be\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u06c1\u0631 \u0633\u0644\u0627\u0679 \u062a\u06be\u0631\u06cc\u0688\u0632 \u06a9\u0648 \u0622\u0632\u0627\u062f\u0627\u0646\u06c1 \u0627\u0648\u0631 \u0628\u06cc\u06a9 \u0648\u0642\u062a \u0686\u0644\u0627 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4 \u0634\u06cc\u0688\u06cc\u0648\u0644\u0631 \u06c1\u0627\u0631\u0688\u0648\u06cc\u0626\u0631 \u0633\u0644\u0627\u0679\u0633 \u06a9\u0648 \u0633\u0628 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u062a\u0631\u062c\u06cc\u062d\u06cc \u062a\u06cc\u0627\u0631 \u062a\u06be\u0631\u06cc\u0688\u0632 \u0633\u06d2 \u0628\u06be\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u06af\u0631 \u06c1\u0627\u0631\u0688\u0648\u06cc\u0626\u0631 \u0633\u0644\u0627\u0679\u0633 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u0633\u0627\u0641\u0679 \u0648\u06cc\u0626\u0631 \u062a\u06be\u0631\u06cc\u0688\u0632 \u06c1\u06cc\u06ba\u060c \u062a\u0648 \u0634\u06cc\u0688\u06cc\u0648\u0644\u0631 \u0679\u0627\u0626\u0645 \u06a9\u0645 \u062a\u0631\u062c\u06cc\u062d\u06cc \u062a\u06be\u0631\u06cc\u0688\u0632 \u06a9\u0648 \u0633\u0644\u0627\u0626\u0633 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u062a\u0627\u06c1\u0645\u060c \u0633\u0628 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u062a\u0631\u062c\u06cc\u062d\u06cc \u062f\u06be\u0627\u06af\u06d2 \u0645\u06cc\u06ba \u06c1\u0627\u0631\u0688\u0648\u06cc\u0626\u0631 \u06a9\u0627 \u0627\u06cc\u06a9 \u0648\u0642\u0641 \u0634\u062f\u06c1 \u0633\u0644\u0627\u0679 \u06c1\u0648\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0633\u06cc\u0627\u0642 \u0648 \u0633\u0628\u0627\u0642 \u06a9\u06d2 \u0633\u0648\u0626\u0686\u0646\u06af \u06a9\u06d2 \u0628\u063a\u06cc\u0631 \u0686\u0644\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u06cc\u06a9 \u0639\u0627\u0645 \u06c1\u06cc\u06a9\u0633\u0627\u06af\u0648\u0646 v66 \u0645\u06cc\u06ba \u0686\u0627\u0631 \u06c1\u0627\u0631\u0688\u0648\u06cc\u0626\u0631 \u062a\u06be\u0631\u06cc\u0688\u0632 \u06a9\u06d2 \u0633\u0627\u062a\u06be\u060c \u0633\u0628 \u0633\u06d2 \u0627\u0648\u067e\u0631 \u0686\u0627\u0631 \u062a\u0631\u062c\u06cc\u062d\u06cc \u062a\u06be\u0631\u06cc\u0688\u0632 \u0645\u06cc\u06ba \u0633\u06d2 \u06c1\u0631 \u0627\u06cc\u06a9 \u06a9\u06cc \u0627\u067e\u0646\u06cc \u0627\u06cc\u06a9\u06cc\u06a9\u06cc\u0648\u0634\u0646 \u067e\u0627\u0626\u067e \u0644\u0627\u0626\u0646 \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4 \u0633\u06cc\u0627\u0642 \u0648 \u0633\u0628\u0627\u0642 \u06a9\u0627 \u0633\u0648\u0626\u0686 \u0635\u0631\u0641 \u0627\u0633 \u0648\u0642\u062a \u06c1\u0648\u062a\u0627 \u06c1\u06d2 \u062c\u0628 \u062a\u06be\u0631\u06cc\u0688 \u06a9\u0648 \u0628\u0644\u0627\u06a9 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2 \u06cc\u0627 \u0627\u06cc\u06a9 \u0627\u0639\u0644\u06cc \u062a\u0631\u062c\u06cc\u062d\u06cc \u062f\u06be\u0627\u06af\u06c1 \u062c\u0627\u06af\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u062f\u06be\u0627\u06af\u06d2 \u06a9\u0648 \u06c1\u0627\u0631\u0688\u0648\u06cc\u0626\u0631 \u0633\u0644\u0627\u0679 \u0645\u06cc\u06ba \u0628\u062f\u0644 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1\u06cc \u0648\u062c\u06c1 \u06c1\u06d2 \u06a9\u06c1 QRT \u0627\u062a\u0646\u06cc \u06a9\u0645 \u0631\u06cc\u0632\u0631\u0648\u06cc\u0634\u0646 \u0645\u06cc\u06ba \u062a\u0627\u062e\u06cc\u0631 \u062d\u0627\u0635\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-full-thread-lifecycle\">\u0645\u06a9\u0645\u0644 \u062a\u06be\u0631\u06cc\u0688 \u0644\u0627\u0626\u0641 \u0633\u0627\u0626\u06cc\u06a9\u0644<\/h3>\n<p>\u0645\u0646\u062f\u0631\u062c\u06c1 \u0630\u06cc\u0644 \u06a9\u0648\u0688 \u0645\u06a9\u0645\u0644 \u062a\u06be\u0631\u06cc\u0688 \u0644\u0627\u0626\u0641 \u0633\u0627\u0626\u06cc\u06a9\u0644 \u062f\u06a9\u06be\u0627\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0633 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u062a\u0628\u0635\u0631\u06d2 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u06a9\u06c1 QRT \u06c1\u0631 \u0642\u062f\u0645 \u067e\u0631 \u06a9\u06cc\u0627 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-c\">static char stack[8192] __attribute__((aligned(8)));\n\nvoid my_func(void *arg)\n{\n    \/* State: RUNNING. Stack is fresh, R0 contains arg. *\/\n    int val = *(int *)arg;\n\n    qurt_mutex_lock(&some_mutex);\n    \/* If mutex is held: state becomes BLOCKED until holder unlocks *\/\n\n    shared_data = val;\n    qurt_mutex_unlock(&some_mutex);\n\n    qurt_thread_exit(QURT_EOK);\n    \/* State becomes DEAD. Joiner (if any) is unblocked. *\/\n}\n\nint main(void)\n{\n    qurt_thread_t tid;\n    qurt_thread_attr_t attr;\n    int my_arg = 42;\n\n    qurt_thread_attr_init(&attr);\n    qurt_thread_attr_set_stack_addr(&attr, stack);\n    qurt_thread_attr_set_stack_size(&attr, sizeof(stack));\n    qurt_thread_attr_set_priority(&attr, 100);\n\n    qurt_thread_create(&tid, &attr, my_func, &my_arg);\n    \/* If my_func's priority (100) > main's: main is preempted here *\/\n\n    int status;\n    qurt_thread_join(tid, &status);\n    \/* Blocks until my_func exits; returns immediately if already exited *\/\n\n    return 0;\n}\n<\/code><\/pre>\n<p>\u062c\u0628 <code>my_func<\/code> \u062c\u0628 \u0639\u0645\u0644 \u062f\u0631\u0622\u0645\u062f \u0634\u0631\u0648\u0639 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u060c \u062f\u0627\u0646\u0627 \u0646\u06d2 \u067e\u06c1\u0644\u06d2 \u06c1\u06cc \u0631\u062c\u0633\u0679\u0631 \u0633\u06cc\u0679 \u06a9\u0631 \u0644\u06cc\u06d2 \u06c1\u06cc\u06ba\u06d4 <code>arg<\/code> \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u067e\u0648\u0627\u0626\u0646\u0679\u0631 \u067e\u0631 \u0645\u0634\u062a\u0645\u0644 \u06c1\u06d2\u06d4 <code>my_arg<\/code>. \u062a\u06be\u0631\u06cc\u0688 \u06a9\u06cc \u062d\u0627\u0644\u062a \u0686\u0644 \u0631\u06c1\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u062c\u0628 \u06cc\u06c1 \u06a9\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 <code>qurt_mutex_lock()<\/code>\u062f\u0648 \u0686\u06cc\u0632\u0648\u06ba \u0645\u06cc\u06ba \u0633\u06d2 \u0627\u06cc\u06a9 \u06c1\u0648 \u06af\u06cc: \u06cc\u0639\u0646\u06cc \u0627\u06af\u0631 mutex \u062f\u0633\u062a\u06cc\u0627\u0628 \u06c1\u0648 \u062a\u0648 \u062f\u06be\u0627\u06af\u06c1 \u0627\u0633\u06d2 \u062d\u0627\u0635\u0644 \u06a9\u0631 \u0644\u06cc\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u062c\u0627\u0631\u06cc \u0631\u06c1\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u06af\u0631 mutex \u06a9\u0633\u06cc \u062f\u0648\u0633\u0631\u06d2 \u062f\u06be\u0627\u06af\u06d2 \u06a9\u06d2 \u067e\u0627\u0633 \u06c1\u0648 \u062a\u0648 \u06a9\u0627\u0644\u0646\u06af \u062a\u06be\u0631\u06cc\u0688 \u06a9\u06cc \u062d\u0627\u0644\u062a \u06a9\u0648 BLOCKED \u0645\u06cc\u06ba \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631 \u062f\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0633 \u06a9\u06d2 \u0631\u062c\u0633\u0679\u0631 TCB \u0645\u06cc\u06ba \u0645\u062d\u0641\u0648\u0638 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0627\u0648\u0631 \u0634\u06cc\u0688\u0648\u0644\u0631 \u0627\u06af\u0644\u06cc \u0633\u0628 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u062a\u0631\u062c\u06cc\u062d\u06cc \u062a\u06cc\u0627\u0631 \u062f\u06be\u0627\u06af\u06d2 \u06a9\u0627 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u062c\u0628 mutex \u06c1\u0648\u0644\u0688\u0631 \u06a9\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 <code>qurt_mutex_unlock()<\/code>\u0645\u0633\u062f\u0648\u062f \u062f\u06be\u0627\u06af\u06d2 \u06a9\u0648 \u0648\u0627\u067e\u0633 READY \u067e\u0631 \u0645\u0646\u062a\u0642\u0644 \u06a9\u0631 \u062f\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0634\u06cc\u0688\u0648\u0644\u0631 \u0627\u067e\u0646\u06cc \u062a\u0631\u062c\u06cc\u062d \u06a9\u0627 \u062f\u0648\u0628\u0627\u0631\u06c1 \u062c\u0627\u0626\u0632\u06c1 \u0644\u06cc\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u06a9\u0648 <code>main<\/code> \u0637\u0631\u0641 <code>qurt_thread_create()<\/code> \u06cc\u06c1 \u067e\u06c1\u0644\u06d2 \u0648\u0627\u067e\u0633 \u0622 \u0633\u06a9\u062a\u0627 \u06c1\u06d2 \u06cc\u0627 \u0646\u06c1\u06cc\u06ba\u06d4 <code>my_func<\/code> \u062e\u062a\u0645 \u06c1\u0648 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u06af\u0631 <code>my_func<\/code> \u0627\u0633\u06d2 \u0627\u0639\u0644\u06cc\u0670 \u062a\u0631\u062c\u06cc\u062d \u062d\u0627\u0635\u0644 \u06c1\u06d2\u06d4 <code>main<\/code>\u0634\u06cc\u0688\u0648\u0644\u0631 preempts. <code>main<\/code> \u0641\u0648\u0631\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0627\u0648\u0631 <code>qurt_thread_create()<\/code> \u062c\u0628 \u062a\u06a9 \u0648\u0627\u067e\u0633 \u0646\u06c1\u06cc\u06ba \u0622\u0626\u06d2 \u06af\u0627\u06d4 <code>my_func<\/code> \u06c1\u0648 \u06af\u06cc\u0627 (\u06cc\u0627 \u0628\u0644\u0627\u06a9)\u06d4 <code>qurt_thread_join()<\/code> \u062f\u0648\u0646\u0648\u06ba \u0628\u0644\u0627\u06a9\u0633 <code>main<\/code> \u06a9\u0648 <code>my_func<\/code> \u0627\u0633\u06d2 \u0641\u0648\u0631\u06cc \u0637\u0648\u0631 \u067e\u0631 \u062e\u062a\u0645 \u06c1\u0648\u0646\u06d2 \u067e\u0631 \u0648\u0627\u067e\u0633 \u06a9\u0631 \u062f\u06cc\u0627 \u062c\u0627\u0626\u06d2 \u06af\u0627 \u06cc\u0627 \u0627\u06af\u0631: <code>my_func<\/code> \u06cc\u06c1 \u067e\u06c1\u0644\u06d2 \u06c1\u06cc \u062e\u062a\u0645 \u06c1\u0648 \u0686\u06a9\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u0633\u0679\u06cc\u06a9 \u0633\u0627\u0626\u0632\u0646\u06af \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u0627\u06c1\u0645 \u0646\u0648\u0679: <code>STACK_SIZE<\/code> \u0627\u0633\u06d2 \u0628\u06c1\u062a \u0686\u06be\u0648\u0679\u06cc \u0686\u06cc\u0632 (\u062c\u06cc\u0633\u06d2 256 \u0628\u0627\u0626\u0679\u0633) \u0645\u06cc\u06ba \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u062a\u06be\u0631\u06cc\u0688 \u0628\u0644\u0627\u06cc\u0627 \u062c\u0627\u0626\u06d2 \u06af\u0627\u06d4 <code>printf<\/code>\u0646\u062a\u06cc\u062c\u06c1 \u06cc\u06c1 \u06c1\u06d2\u06d4 <strong>\u0627\u0633\u0679\u06cc\u06a9 \u0627\u0648\u0648\u0631 \u0641\u0644\u0648<\/strong>. QRT \u0627\u0633\u0679\u06cc\u06a9 \u0627\u0648\u0648\u0631 \u0641\u0644\u0648 \u06a9\u0627 \u067e\u062a\u06c1 \u0646\u06c1\u06cc\u06ba \u0644\u06af\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u062d\u0627\u062f\u062b\u06d2 \u067e\u0631\u0633\u06a9\u0648\u0646 \u0627\u0648\u0631 \u062a\u0634\u062e\u06cc\u0635 \u06a9\u0631\u0646\u0627 \u0645\u0634\u06a9\u0644 \u06c1\u06cc\u06ba\u06d4 \u0627\u067e\u0646\u06d2 \u062a\u06be\u0631\u06cc\u0688\u0632 \u06a9\u0648 \u06c1\u0645\u06cc\u0634\u06c1 \u06a9\u0645 \u0627\u0632 \u06a9\u0645 8192 \u0628\u0627\u0626\u0679\u0633 \u06a9\u0627 \u0627\u0633\u0679\u06cc\u06a9 \u062f\u06cc\u06ba \u0627\u0648\u0631 \u067e\u0631\u0648\u0641\u0627\u0626\u0644\u0646\u06af \u06a9\u06d2 \u0628\u0639\u062f \u0628\u0639\u062f \u0645\u06cc\u06ba \u0622\u067e\u0679\u06cc\u0645\u0627\u0626\u0632 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-building-and-running-on-the-simulator\">\u0633\u0645\u06cc\u0644\u06cc\u0679\u0631 \u0645\u06cc\u06ba \u0628\u0646\u0627\u0626\u06cc\u06ba \u0627\u0648\u0631 \u0686\u0644\u0627\u0626\u06cc\u06ba\u06d4<\/h3>\n<p>\u0645\u0633\u062f\u0633 SDK \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2: <code>make<\/code> \u0630\u06cc\u0644 \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u0631\u06cc\u067e\u0631 \u06c1\u06d2 \u062c\u0633\u06d2 SCons \u06a9\u06c1\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0645\u0646\u062f\u0631\u062c\u06c1 \u0630\u06cc\u0644 \u06a9\u0645\u0627\u0646\u0688 \u0633\u0628 \u0627\u06cc\u06a9 \u062c\u06cc\u0633\u06d2 \u0646\u062a\u0627\u0626\u062c \u067e\u06cc\u062f\u0627 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba:<\/p>\n<pre><code class=\"language-bash\"># Option 1: Use the make wrapper (invokes SCons internally)\ncd $HEXAGON_SDK_ROOT\nmake V=hexagon_Release_dynamic_toolv84_v66 \n     tree=my_qurt_project\n\n# Option 2: Invoke SCons directly\ncd $HEXAGON_SDK_ROOT\npython tools\/build\/scons\/scons.py \n    V=hexagon_Release_dynamic_toolv84_v66 \n    my_qurt_project\n<\/code><\/pre>\n<p>\u062f\u0648\u0646\u0648\u06ba \u06a9\u0645\u0627\u0646\u0688\u0632 \u0631\u06cc\u0644\u06cc\u0632 \u0645\u0648\u0688 \u0645\u06cc\u06ba v84 \u0679\u0648\u0644 \u0686\u06cc\u0646 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u06c1\u06cc\u06a9\u0633\u0627\u06af\u0648\u0646 v66 \u0641\u0646 \u062a\u0639\u0645\u06cc\u0631 \u06a9\u06d2 \u0645\u0646\u0635\u0648\u0628\u06d2 \u0628\u0646\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u06a9\u06c1 <code>make<\/code> \u0631\u06cc\u067e\u0631 \u0627\u06cc\u06a9 \u0633\u06c1\u0648\u0644\u062a \u06a9\u06cc \u067e\u0631\u062a \u06c1\u06d2\u06d4 <code>V=<\/code> \u0627\u0648\u0631 <code>tree=<\/code> \u0627\u067e\u0646\u0627 \u062f\u0639\u0648\u06cc\u0670 \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 \u0627\u0633\u06d2 SCons \u06a9\u0648 \u0628\u06be\u06cc\u062c\u06cc\u06ba\u06d4 SCons \u0645\u0646\u062f\u0631\u062c\u06c1 \u0630\u06cc\u0644 \u0627\u0636\u0627\u0641\u06cc \u062c\u06be\u0646\u0688\u0648\u06ba \u062a\u06a9 \u0628\u0631\u0627\u06c1 \u0631\u0627\u0633\u062a \u0631\u0633\u0627\u0626\u06cc \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u062a\u0627 \u06c1\u06d2: <code>--jobs=N<\/code> \u0645\u062a\u0648\u0627\u0632\u06cc \u062a\u0639\u0645\u06cc\u0631\u0627\u062a \u06a9\u06d2 \u0644\u06cc\u06d2 <code>--verbose<\/code> \u0645\u06a9\u0645\u0644 \u06a9\u0645\u067e\u0627\u0626\u0644\u0631 \u06a9\u0645\u0627\u0646\u0688 \u0622\u0624\u0679 \u067e\u0679 \u06a9\u06d2 \u0644\u06cc\u06d2\u06d4<\/p>\n<pre><code class=\"language-bash\"># Run on the simulator\nhexagon-sim --simulated_returnval \n    --cosim_file osam.cfg \n    -- bootimg.pbn \n    -- my_qurt_app.so\n<\/code><\/pre>\n<p>\u06a9\u06c1 <code>hexagon-sim<\/code> \u06a9\u0645\u0627\u0646\u0688 \u0627\u06cc\u06a9 \u0645\u0631\u062a\u0628 \u06a9\u0631\u062f\u06c1 \u0627\u06cc\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u06a9\u06d2 \u0633\u0627\u062a\u06be QRT \u0633\u0645\u06cc\u0644\u06cc\u0679\u0631 \u0634\u0631\u0648\u0639 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4 \u06a9\u06c1 <code>--simulated_returnval<\/code> \u067e\u0631\u0686\u0645 \u0622\u067e \u06a9\u06cc \u0648\u0627\u067e\u0633\u06cc \u06a9\u06cc \u0642\u06cc\u0645\u062a \u06a9\u0648 \u067e\u06a9\u0691\u062a\u0627 \u06c1\u06d2\u06d4 <code>main<\/code> \u0641\u0646\u06a9\u0634\u0646 \u0627\u0648\u0631 <code>--cosim_file<\/code> QRT OS \u06a9\u0646\u0641\u06cc\u06af\u0631\u06cc\u0634\u0646 \u06a9\u0627 \u062d\u0648\u0627\u0644\u06c1 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-working-with-multiple-threads\">\u0645\u0644\u0679\u06cc \u062a\u06be\u0631\u06cc\u0688\u0688 \u0622\u067e\u0631\u06cc\u0634\u0646<\/h2>\n<p>\u0627\u06cc\u06a9 \u062d\u0642\u06cc\u0642\u06cc QRT \u0627\u06cc\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u062a\u06be\u0631\u06cc\u0688\u0632 \u0628\u06cc\u06a9 \u0648\u0642\u062a \u0686\u0644\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0688\u06cc \u0627\u06cc\u0633 \u067e\u06cc \u067e\u0631\u0648\u06af\u0631\u0627\u0645\u0646\u06af \u0645\u06cc\u06ba \u067e\u0631\u0648\u0688\u06cc\u0648\u0633\u0631-\u0635\u0627\u0631\u0641 \u067e\u06cc\u0679\u0631\u0646 \u0633\u0628 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u0639\u0627\u0645 \u067e\u06cc\u0679\u0631\u0646 \u0645\u06cc\u06ba \u0633\u06d2 \u0627\u06cc\u06a9 \u06c1\u06d2\u06d4 \u0627\u06cc\u06a9 \u062a\u06be\u0631\u06cc\u0688 \u06c1\u0627\u0631\u0688 \u0648\u06cc\u0626\u0631 \u0633\u06d2 \u067e\u0691\u06be\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u062f\u0648\u0633\u0631\u0627 \u062a\u06be\u0631\u06cc\u0688 \u0688\u06cc\u0679\u0627 \u067e\u0631 \u06a9\u0627\u0631\u0631\u0648\u0627\u0626\u06cc \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-c\">#include <stdio.h>\n#include <qurt.h>\n\n#define STACK_SIZE    8192\n#define BUFFER_SIZE   16\n#define NUM_ITEMS     100\n\n\/* Thread stacks *\/\nstatic char producer_stack[STACK_SIZE] __attribute__((aligned(8)));\nstatic char consumer_stack[STACK_SIZE] __attribute__((aligned(8)));\n\n\/* Shared buffer *\/\nstatic int buffer[BUFFER_SIZE];\nstatic int head = 0;\nstatic int tail = 0;\nstatic int count = 0;\n\n\/* Synchronization primitives *\/\nqurt_mutex_t buffer_mutex;\nqurt_cond_t  not_full;\nqurt_cond_t  not_empty;\n\nvoid producer_thread(void *arg)\n{\n    for (int i = 0; i < NUM_ITEMS; i++) {\n        qurt_mutex_lock(&#038;buffer_mutex);\n\n        \/* Wait until there is space in the buffer *\/\n        while (count == BUFFER_SIZE) {\n            qurt_cond_wait(&#038;not_full, &#038;buffer_mutex);\n        }\n\n        \/* Produce an item *\/\n        buffer[head] = i;\n        head = (head + 1) % BUFFER_SIZE;\n        count++;\n\n        printf(\"[Producer] Put item %d (buffer count: %d)n\", i, count);\n\n        \/* Signal the consumer that data is available *\/\n        qurt_cond_signal(&#038;not_empty);\n        qurt_mutex_unlock(&#038;buffer_mutex);\n    }\n\n    qurt_thread_exit(QURT_EOK);\n}\n\nvoid consumer_thread(void *arg)\n{\n    for (int i = 0; i < NUM_ITEMS; i++) {\n        qurt_mutex_lock(&#038;buffer_mutex);\n\n        \/* Wait until there is data in the buffer *\/\n        while (count == 0) {\n            qurt_cond_wait(&#038;not_empty, &#038;buffer_mutex);\n        }\n\n        \/* Consume an item *\/\n        int item = buffer[tail];\n        tail = (tail + 1) % BUFFER_SIZE;\n        count--;\n\n        printf(\"[Consumer] Got item %d (buffer count: %d)n\", item, count);\n\n        \/* Signal the producer that space is available *\/\n        qurt_cond_signal(&#038;not_full);\n        qurt_mutex_unlock(&#038;buffer_mutex);\n    }\n\n    qurt_thread_exit(QURT_EOK);\n}\n\nint main(void)\n{\n    qurt_thread_t producer, consumer;\n    qurt_thread_attr_t attr;\n\n    \/* Initialize sync primitives BEFORE creating threads *\/\n    qurt_mutex_init(&#038;buffer_mutex);\n    qurt_cond_init(&#038;not_full);\n    qurt_cond_init(&#038;not_empty);\n\n    \/* Create producer (higher priority) *\/\n    qurt_thread_attr_init(&#038;attr);\n    qurt_thread_attr_set_name(&#038;attr, \"producer\");\n    qurt_thread_attr_set_stack_addr(&#038;attr, producer_stack);\n    qurt_thread_attr_set_stack_size(&#038;attr, STACK_SIZE);\n    qurt_thread_attr_set_priority(&#038;attr, 100);\n    qurt_thread_create(&#038;producer, &#038;attr, producer_thread, NULL);\n\n    \/* Create consumer (lower priority) *\/\n    qurt_thread_attr_init(&#038;attr);\n    qurt_thread_attr_set_name(&#038;attr, \"consumer\");\n    qurt_thread_attr_set_stack_addr(&#038;attr, consumer_stack);\n    qurt_thread_attr_set_stack_size(&#038;attr, STACK_SIZE);\n    qurt_thread_attr_set_priority(&#038;attr, 110);\n    qurt_thread_create(&#038;consumer, &#038;attr, consumer_thread, NULL);\n\n    \/* Wait for both threads to finish *\/\n    int status;\n    qurt_thread_join(producer, &#038;status);\n    qurt_thread_join(consumer, &#038;status);\n\n    \/* Clean up *\/\n    qurt_mutex_destroy(&#038;buffer_mutex);\n    qurt_cond_destroy(&#038;not_full);\n    qurt_cond_destroy(&#038;not_empty);\n\n    printf(\"All done! Produced and consumed %d items.n\", NUM_ITEMS);\n    return 0;\n}\n<\/qurt.h><\/stdio.h><\/code><\/pre>\n<p>\u06cc\u06c1 \u06a9\u0648\u0688 \u0631\u0648\u0627\u06cc\u062a\u06cc \u067e\u0627\u0628\u0646\u062f \u0628\u0641\u0631 \u067e\u0631\u0648\u0688\u06cc\u0648\u0633\u0631-\u0635\u0627\u0631\u0641 \u067e\u06cc\u0679\u0631\u0646 \u06a9\u0648 \u0646\u0627\u0641\u0630 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0645\u0634\u062a\u0631\u06a9\u06c1 \u0628\u0641\u0631 16 \u0639\u062f\u062f \u06a9\u0627 \u0627\u06cc\u06a9 \u0633\u0631\u06a9\u0644\u0631 \u0633\u0631\u0646\u06cc \u06c1\u06d2 \u062c\u0648 \u0627\u06cc\u06a9 mutex \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0645\u062d\u0641\u0648\u0638 \u06c1\u06d2\u06d4 \u067e\u0631\u0648\u0688\u06cc\u0648\u0633\u0631 \u0628\u0641\u0631 \u06a9\u0648 \u0627\u0634\u06cc\u0627\u0621 \u0644\u06a9\u06be\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0635\u0627\u0631\u0641\u06cc\u0646 \u0627\u0634\u06cc\u0627\u0621 \u067e\u0691\u06be\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u062c\u0628 \u0628\u0641\u0631 \u0628\u06be\u0631 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u067e\u0631\u0648\u0688\u06cc\u0648\u0633\u0631 \u0628\u0644\u0627\u06a9 \u06a9\u0631\u062a\u0627 \u06c1\u06d2: <code>not_full<\/code> \u062d\u0627\u0644\u062a \u0645\u062a\u063a\u06cc\u0631\u06d4 \u0627\u06af\u0631 \u0628\u0641\u0631 \u062e\u0627\u0644\u06cc \u06c1\u06d2 \u062a\u0648\u060c \u0635\u0627\u0631\u0641 \u0628\u0644\u0627\u06a9 \u06a9\u0631\u062a\u0627 \u06c1\u06d2: <code>not_empty<\/code>. \u06c1\u0631 \u0637\u0631\u0641 \u0627\u067e\u0646\u06d2 \u0628\u0641\u0631\u0632 \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u067e\u06be\u0631 \u062f\u0648\u0633\u0631\u06d2 \u06a9\u0648 \u0633\u06af\u0646\u0644 \u0628\u06be\u06cc\u062c\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0688\u06cc\u0632\u0627\u0626\u0646 \u06a9\u06d2 \u0644\u062d\u0627\u0638 \u0633\u06d2\u060c \u067e\u0631\u0648\u0688\u06cc\u0648\u0633\u0631 \u06a9\u0648 \u0635\u0627\u0631\u0641\u06cc\u0646 (110) \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u062a\u0631\u062c\u06cc\u062d (100) \u062d\u0627\u0635\u0644 \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4 \u0627\u06cc\u06a9 \u062d\u0642\u06cc\u0642\u06cc DSP \u0645\u0646\u0638\u0631 \u0646\u0627\u0645\u06d2 \u0645\u06cc\u06ba\u060c \u067e\u0631\u0648\u0688\u06cc\u0648\u0633\u0631 \u0639\u0627\u0645 \u0637\u0648\u0631 \u067e\u0631 \u06c1\u0627\u0631\u0688 \u0648\u06cc\u0626\u0631 (\u0645\u0627\u0626\u06cc\u06a9\u0631\u0648\u0641\u0648\u0646\u060c \u0633\u06cc\u0646\u0633\u0631) \u0633\u06d2 \u0645\u0639\u0644\u0648\u0645\u0627\u062a \u067e\u0691\u06be\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u06af\u0631 \u06a9\u0648\u0626\u06cc \u067e\u0631\u0648\u0688\u06cc\u0648\u0633\u0631 \u06c1\u0627\u0631\u0688\u0648\u06cc\u0626\u0631 \u06a9\u0627 \u0646\u0645\u0648\u0646\u06c1 \u06a9\u06be\u0648 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u0648\u06c1 \u0688\u06cc\u0679\u0627 \u06c1\u0645\u06cc\u0634\u06c1 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0636\u0627\u0626\u0639 \u06c1\u0648 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u0635\u0627\u0631\u0641\u06cc\u0646 \u0628\u0639\u062f \u0645\u06cc\u06ba \u06a9\u0633\u06cc \u0628\u06be\u06cc \u0648\u0642\u062a \u0627\u067e\u0646\u06d2 \u0688\u06cc\u0679\u0627 \u067e\u0631 \u06a9\u0627\u0631\u0631\u0648\u0627\u0626\u06cc \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u06cc\u06c1 RTOS \u0688\u06cc\u0632\u0627\u0626\u0646 \u06a9\u0627 \u0627\u06cc\u06a9 \u0639\u0645\u0648\u0645\u06cc \u0627\u0635\u0648\u0644 \u06c1\u06d2\u06d4 <strong>\u06c1\u0627\u0631\u0688 \u0648\u06cc\u0626\u0631 \u0633\u06d2 \u0645\u062a\u0639\u0644\u0642\u06c1 \u062f\u06be\u0627\u06af\u0648\u06ba \u06a9\u0648 \u0628\u06be\u0648\u06a9\u0627 \u0646\u06c1 \u0631\u06a9\u06be\u06cc\u06ba\u06d4<\/strong><\/p>\n<h2 id=\"heading-synchronization-primitives\">\u06c1\u0645 \u0648\u0642\u062a \u0633\u0627\u0632\u06cc \u06a9\u06d2 \u0627\u0628\u062a\u062f\u0627\u0626\u06cc<\/h2>\n<p>QRT \u067e\u0627\u0646\u0686 \u0627\u06c1\u0645 \u06c1\u0645 \u0622\u06c1\u0646\u06af\u06cc \u0645\u06cc\u06a9\u0627\u0646\u0632\u0645 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2: mutexes\u060c \u062d\u0627\u0644\u062a \u0645\u062a\u063a\u06cc\u0631\u060c \u0633\u06af\u0646\u0644\u060c \u0631\u06a9\u0627\u0648\u0679\u06cc\u06ba\u060c \u0627\u0648\u0631 \u0633\u06cc\u0645\u0641\u0648\u0631\u0633\u06d4<\/p>\n<pre><code class=\"language-plaintext\">\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 Primitive    \u2502 When to Use                                        \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Mutex        \u2502 Protecting shared data from concurrent access      \u2502\n\u2502 Condition Var\u2502 \"Wait until X is true\" (always paired with mutex)  \u2502\n\u2502 Signal       \u2502 One thread notifying another (like poking someone) \u2502\n\u2502 Barrier      \u2502 \"Everyone wait here until all threads arrive\"      \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Semaphore    \u2502 Controlling access to a limited resource pool      \u2502\n\u2502              \u2502 (for example, 4 DMA channels shared by 10 threads)        \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u062c\u062f\u0648\u0644 \u06c1\u0631 \u0642\u062f\u06cc\u0645 \u0627\u0648\u0631 \u0627\u0633 \u06a9\u06d2 \u0628\u0646\u06cc\u0627\u062f\u06cc \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06d2 \u0645\u0639\u0627\u0645\u0644\u06d2 \u06a9\u0627 \u062e\u0644\u0627\u0635\u06c1 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 Mutex \u0645\u0634\u062a\u0631\u06a9\u06c1 \u0688\u06cc\u0679\u0627 \u062a\u06a9 \u062e\u0635\u0648\u0635\u06cc \u0631\u0633\u0627\u0626\u06cc \u06a9\u0648 \u0646\u0627\u0641\u0630 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u06a9\u0646\u0688\u06cc\u0634\u0646 \u0645\u062a\u063a\u06cc\u0631\u0627\u062a \u062f\u06be\u0627\u06af\u06d2 \u06a9\u0648 \u0627\u0633 \u0648\u0642\u062a \u062a\u06a9 \u0633\u0648\u062a\u06d2 \u0631\u06c1\u062a\u06d2 \u06c1\u06cc\u06ba \u062c\u0628 \u062a\u06a9 \u06a9\u06c1 \u0688\u06cc\u0679\u0627 \u06a9\u06cc \u0627\u06cc\u06a9 \u0645\u062e\u0635\u0648\u0635 \u062d\u0627\u0644\u062a \u062f\u0631\u0633\u062a \u0646\u06c1 \u06c1\u0648 \u062c\u0627\u0626\u06d2 \u0627\u0648\u0631 \u06c1\u0645\u06cc\u0634\u06c1 mutexes \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0633\u06af\u0646\u0644 \u062a\u06be\u0631\u06cc\u0688\u0632 \u06a9\u06d2 \u062f\u0631\u0645\u06cc\u0627\u0646 \u06c1\u0644\u06a9\u06d2 \u067e\u06be\u0644\u06a9\u06d2 \u0648\u0646 \u0679\u0648 \u0648\u0646 \u0627\u0637\u0644\u0627\u0639 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u06cc\u06a9 \u0631\u06a9\u0627\u0648\u0679 \u0627\u06cc\u06a9 \u0645\u0634\u062a\u0631\u06a9\u06c1 \u0646\u0642\u0637\u06c1 \u067e\u0631 \u062f\u06be\u0627\u06af\u0648\u06ba \u06a9\u06d2 \u0627\u06cc\u06a9 \u06af\u0631\u0648\u067e \u06a9\u0648 \u06c1\u0645 \u0622\u06c1\u0646\u06af \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4 \u0633\u06cc\u0645\u0641\u0648\u0631\u0633 N \u0627\u06cc\u06a9 \u062c\u06cc\u0633\u06d2 \u0648\u0633\u0627\u0626\u0644 \u06a9\u06d2 \u062a\u0627\u0644\u0627\u0628 \u062a\u06a9 \u0631\u0633\u0627\u0626\u06cc \u06a9\u0648 \u06a9\u0646\u0679\u0631\u0648\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-mutexes\">mutex<\/h3>\n<p>\u0627\u06cc\u06a9 mutex \u0627\u0633 \u0628\u0627\u062a \u06a9\u0648 \u06cc\u0642\u06cc\u0646\u06cc \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u0627\u06cc\u06a9 \u0648\u0642\u062a \u0645\u06cc\u06ba \u0635\u0631\u0641 \u0627\u06cc\u06a9 \u062a\u06be\u0631\u06cc\u0688 \u0627\u06cc\u06a9 \u0627\u06c1\u0645 \u062d\u0635\u06d2 \u062a\u06a9 \u0631\u0633\u0627\u0626\u06cc \u062d\u0627\u0635\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 QRT mutexes \u063a\u06cc\u0631 \u0645\u0633\u062f\u0648\u062f \u062d\u0635\u0648\u0644 \u06a9\u06cc \u0628\u06be\u06cc \u062d\u0645\u0627\u06cc\u062a \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba: <code>qurt_mutex_try_lock()<\/code>.<\/p>\n<pre><code class=\"language-c\">qurt_mutex_t my_mutex;\n\nvoid init_example(void)\n{\n    \/* Always initialize before use *\/\n    qurt_mutex_init(&my_mutex);\n}\n\nvoid critical_section_example(void)\n{\n    qurt_mutex_lock(&my_mutex);\n\n    \/* Only one thread can be here at a time *\/\n    shared_counter++;\n    shared_buffer[index] = new_value;\n\n    qurt_mutex_unlock(&my_mutex);\n}\n\n\/* Non-blocking version *\/\nvoid try_lock_example(void)\n{\n    int result = qurt_mutex_try_lock(&my_mutex);\n\n    if (result == QURT_EOK) {\n        shared_counter++;\n        qurt_mutex_unlock(&my_mutex);\n    } else {\n        printf(\"Busy, will try latern\");\n    }\n}\n\nvoid cleanup_example(void)\n{\n    qurt_mutex_destroy(&my_mutex);\n}\n<\/code><\/pre>\n<p>\u06a9\u06c1 <code>qurt_mutex_lock()<\/code> \u06a9\u0627\u0644 \u06a9\u0627\u0644\u0646\u06af \u062a\u06be\u0631\u06cc\u0688 \u06a9\u0648 \u0628\u0644\u0627\u06a9 \u06a9\u0631\u062a\u06cc \u06c1\u06d2 \u062c\u0628 \u062a\u06a9 \u06a9\u06c1 mutex \u062f\u0633\u062a\u06cc\u0627\u0628 \u0646\u06c1 \u06c1\u0648 \u0627\u0648\u0631 \u067e\u06be\u0631 \u0627\u0633\u06d2 \u062d\u0627\u0635\u0644 \u06a9\u0631 \u0644\u06d2\u06d4 <code>qurt_mutex_try_lock()<\/code> \u06cc\u06c1 mutex \u062d\u0627\u0635\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u06a9\u0648\u0634\u0634 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0641\u0648\u0631\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0648\u0627\u067e\u0633 \u0622\u062a\u0627 \u06c1\u06d2\u06d4 <code>QURT_EOK<\/code> \u06a9\u0627\u0645\u06cc\u0627\u0628\u06cc \u067e\u0631 \u063a\u0644\u0637\u06cc \u06a9\u0627 \u06a9\u0648\u0688 \u06cc\u0627 \u0627\u06af\u0631 mutex \u0628\u0631\u0642\u0631\u0627\u0631 \u06c1\u06d2\u06d4 \u06c1\u0645\u06cc\u0634\u06c1 \u0645\u062c\u06be\u06d2 \u06a9\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u06d4 <code>qurt_mutex_destroy()<\/code> mutex \u0622\u067e\u0631\u06cc\u0634\u0646 \u0645\u06a9\u0645\u0644 \u06c1\u0648\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f.<\/p>\n<p>QRT mutex \u06a9\u0627 \u0646\u0641\u0627\u0630 <strong>\u062a\u0631\u062c\u06cc\u062d\u06cc \u0648\u0631\u0627\u062b\u062a<\/strong>. \u0627\u06af\u0631 \u0627\u06cc\u06a9 \u0627\u0639\u0644\u06cc \u062a\u0631\u062c\u06cc\u062d\u06cc \u062f\u06be\u0627\u06af\u06c1 \u06a9\u0645 \u062a\u0631\u062c\u06cc\u062d\u06cc \u062f\u06be\u0627\u06af\u06d2 \u06a9\u06d2 \u067e\u0627\u0633 \u0645\u0648\u062c\u0648\u062f mutex \u067e\u0631 \u0627\u0646\u062a\u0638\u0627\u0631 \u06a9\u0631 \u0631\u06c1\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u06a9\u0645 \u062a\u0631\u062c\u06cc\u062d \u0648\u0627\u0644\u06d2 \u062f\u06be\u0627\u06af\u06d2 \u06a9\u0648 \u0639\u0627\u0631\u0636\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0627\u0639\u0644\u06cc \u062a\u0631\u062c\u06cc\u062d\u06cc \u0633\u0637\u062d \u067e\u0631 \u062a\u0631\u0642\u06cc \u062f\u06cc \u062c\u0627\u062a\u06cc \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0631\u0648\u06a9\u062a\u0627 \u06c1\u06d2\u06d4 <strong>\u062a\u0631\u062c\u06cc\u062d\u06cc \u0627\u0644\u0679\u0627<\/strong>\u06cc\u06c1 \u0627\u06cc\u06a9 \u06a9\u0644\u0627\u0633\u06a9 \u0628\u06af \u06c1\u06d2 \u062c\u0633 \u06a9\u06cc \u0648\u062c\u06c1 \u0633\u06d2 \u0645\u0627\u0631\u0633 \u067e\u0627\u062a\u06be \u0641\u0627\u0626\u0646\u0688\u0631 \u062e\u0644\u0627\u0626\u06cc \u062c\u06c1\u0627\u0632 \u0627\u067e\u0646\u06d2 \u0645\u0634\u0646 \u06a9\u06d2 \u062f\u0648\u0631\u0627\u0646 \u062e\u0648\u062f \u06a9\u0648 \u0628\u0627\u0631 \u0628\u0627\u0631 \u062f\u0648\u0628\u0627\u0631\u06c1 \u062a\u0631\u062a\u06cc\u0628 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>QRT \u062a\u0631\u062c\u06cc\u062d\u06cc \u0648\u0631\u0627\u062b\u062a \u06a9\u0648 \u062e\u0648\u062f \u0628\u062e\u0648\u062f \u06c1\u06cc\u0646\u0688\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u0622\u067e \u06a9\u0648 \u0627\u0633 \u06a9\u06d2 \u06c1\u0648\u0646\u06d2 \u0633\u06d2 \u0622\u06af\u0627\u06c1 \u06c1\u0648\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2 \u062a\u0627\u06a9\u06c1 \u0688\u06cc\u0628\u06af \u06a9\u0631\u062a\u06d2 \u0648\u0642\u062a \u0622\u067e \u063a\u06cc\u0631 \u0645\u062a\u0648\u0642\u0639 \u062a\u0631\u062c\u06cc\u062d\u06cc \u0631\u0648\u06cc\u06d2 \u0633\u06d2 \u0627\u0644\u062c\u06be\u0646 \u0645\u06cc\u06ba \u0646\u06c1 \u067e\u0691\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-signals\">\u0633\u06af\u0646\u0644<\/h3>\n<p>QRT \u06a9\u06d2 \u0633\u06af\u0646\u0644 \u06c1\u0644\u06a9\u0627 \u067e\u06be\u0644\u06a9\u0627 \u0646\u0648\u0679\u06cc\u0641\u06a9\u06cc\u0634\u0646 \u0645\u06cc\u06a9\u0627\u0646\u0632\u0645 \u06c1\u06cc\u06ba\u06d4 \u0627\u06cc\u06a9 \u062a\u06be\u0631\u06cc\u0688 \u0627\u06cc\u06a9 \u0645\u062e\u0635\u0648\u0635 \u0633\u06af\u0646\u0644 \u0628\u0679 \u06a9\u0627 \u0627\u0646\u062a\u0638\u0627\u0631 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u062f\u0648\u0633\u0631\u06d2 \u062a\u06be\u0631\u06cc\u0688\u0632 (\u06cc\u0627 ISRs) \u0627\u0633 \u0628\u0679 \u06a9\u0648 \u0628\u06cc\u062f\u0627\u0631 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0633\u06cc\u0679 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-c\">#include <qurt.h>\n\n#define SIGNAL_DATA_READY   0x01\n#define SIGNAL_STOP         0x02\n#define SIGNAL_ERROR        0x04\n\nqurt_signal_t my_signal;\n\nvoid signal_init(void)\n{\n    qurt_signal_init(&my_signal);\n}\n\n\/* Waiting thread *\/\nvoid waiter_thread(void *arg)\n{\n    unsigned int received_signals;\n\n    while (1) {\n        \/* Wait for ANY of these signals *\/\n        received_signals = qurt_signal_wait(\n            &my_signal,\n            SIGNAL_DATA_READY | SIGNAL_STOP | SIGNAL_ERROR,\n            QURT_SIGNAL_ATTR_WAIT_ANY\n        );\n\n        if (received_signals & SIGNAL_STOP) {\n            printf(\"Received stop signal. Exiting.n\");\n            break;\n        }\n\n        if (received_signals & SIGNAL_DATA_READY) {\n            printf(\"Data is ready! Processing...n\");\n            process_data();\n            \/* Clear the signal after handling it *\/\n            qurt_signal_clear(&my_signal, SIGNAL_DATA_READY);\n        }\n\n        if (received_signals & SIGNAL_ERROR) {\n            printf(\"Error occurred! Handling...n\");\n            handle_error();\n            qurt_signal_clear(&my_signal, SIGNAL_ERROR);\n        }\n    }\n\n    qurt_signal_destroy(&my_signal);\n    qurt_thread_exit(QURT_EOK);\n}\n\n\/* Signaling thread (or ISR) *\/\nvoid sender_thread(void *arg)\n{\n    prepare_data();\n    qurt_signal_set(&my_signal, SIGNAL_DATA_READY);\n\n    \/* Later, tell it to stop *\/\n    qurt_signal_set(&my_signal, SIGNAL_STOP);\n\n    qurt_thread_exit(QURT_EOK);\n}\n<\/qurt.h><\/code><\/pre>\n<p>\u06a9\u0627\u0644 \u0627\u0646\u062a\u0638\u0627\u0631 \u06a9\u0627 \u062f\u06be\u0627\u06af\u06c1 <code>qurt_signal_wait()<\/code> \u062f\u0644\u0686\u0633\u067e\u06cc \u06a9\u06d2 \u0633\u06af\u0646\u0644 \u06a9\u0627 \u0628\u0679 \u0645\u0627\u0633\u06a9 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u06d4 <code>QURT_SIGNAL_ATTR_WAIT_ANY<\/code> \u062c\u0628 \u0645\u062e\u0635\u0648\u0635 \u0628\u0679\u0633 \u0645\u06cc\u06ba \u0633\u06d2 \u0627\u06cc\u06a9 \u0633\u06cc\u0679 \u06c1\u0648\u062c\u0627\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 \u06a9\u06c1 \u062a\u06be\u0631\u06cc\u0688 \u062c\u0627\u06af \u062c\u0627\u0626\u06d2 \u06af\u0627\u06d4 \u062a\u06be\u0631\u06cc\u0688 \u06a9\u0627\u0644 \u0628\u06be\u06cc\u062c\u06cc \u062c\u0627 \u0631\u06c1\u06cc \u06c1\u06d2\u06d4 <code>qurt_signal_set()<\/code> \u0627\u06cc\u06a9 \u06cc\u0627 \u0632\u06cc\u0627\u062f\u06c1 \u0628\u0679\u0633 \u0633\u06cc\u0679 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0633\u06af\u0646\u0644 \u067e\u0631 \u06a9\u0627\u0631\u0631\u0648\u0627\u0626\u06cc \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f\u060c \u0648\u06cc\u0679\u0631 \u06a9\u0648 \u0627\u06cc\u06a9 \u0641\u0648\u0646 \u06a9\u0627\u0644 \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u06d4 <code>qurt_signal_clear()<\/code> \u0628\u0679 \u06a9\u0648 \u062f\u0648\u0628\u0627\u0631\u06c1 \u062a\u0631\u062a\u06cc\u0628 \u062f\u06cc\u06ba\u06d4 \u0627\u06af\u0631 \u0622\u067e \u0633\u06af\u0646\u0644 \u0635\u0627\u0641 \u06a9\u0631\u0646\u0627 \u0628\u06be\u0648\u0644 \u062c\u0627\u062a\u06d2 \u06c1\u06cc\u06ba \u062a\u0648 \u0627\u06af\u0644\u06cc \u06a9\u0627\u0644 \u06c1\u06d2\u06d4 <code>qurt_signal_wait()<\/code> \u06cc\u06c1 \u0641\u0648\u0631\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0648\u0627\u067e\u0633 \u0622\u062c\u0627\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u062f\u06be\u0627\u06af\u06c1 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0627\u0633\u06cc \u0648\u0627\u0642\u0639\u06c1 \u067e\u0631 \u06a9\u0627\u0631\u0631\u0648\u0627\u0626\u06cc \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0633\u06af\u0646\u0644\u0632 \u0627\u0648\u0631 \u06a9\u0646\u0688\u06cc\u0634\u0646 \u0645\u062a\u063a\u06cc\u0631 \u06a9\u06d2 \u062f\u0631\u0645\u06cc\u0627\u0646 \u0627\u0646\u062a\u062e\u0627\u0628 \u0622\u067e \u06a9\u06d2 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06d2 \u0645\u0639\u0627\u0645\u0644\u06d2 \u067e\u0631 \u0645\u0646\u062d\u0635\u0631 \u06c1\u06d2\u06d4 \u0633\u06af\u0646\u0644\u0632 \u0622\u0633\u0627\u0646 \u0627\u0648\u0631 \u06c1\u0644\u06a9\u06d2 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0627\u0633 \u0644\u06cc\u06d2 \u0648\u06c1 \u063a\u06cc\u0631 \u0645\u062a\u0639\u0644\u0642\u06c1 \u062f\u06be\u0627\u06af\u0648\u06ba \u06cc\u0627 ISRs \u06a9\u06d2 \u062f\u0631\u0645\u06cc\u0627\u0646 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u06a9\u06d2 \u0644\u06cc\u06d2 \u0628\u06c1\u062a\u0631\u06cc\u0646 \u0645\u0648\u0632\u0648\u06ba \u06c1\u06cc\u06ba\u06d4 \u06a9\u0646\u0688\u06cc\u0634\u0646 \u0645\u062a\u063a\u06cc\u0631\u0627\u062a \u0627\u0633 \u0648\u0642\u062a \u0628\u06c1\u062a\u0631 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba \u062c\u0628 \u0646\u0648\u0679\u06cc\u0641\u06a9\u06cc\u0634\u0646 \u06a9\u0648 \u0688\u06cc\u0679\u0627 \u06a9\u06cc \u0645\u062e\u0635\u0648\u0635 \u062d\u0627\u0644\u062a \u0633\u06d2 \u0645\u0646\u0633\u0644\u06a9 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2 (\u0628\u0641\u0631 \u0645\u06a9\u0645\u0644\u060c \u0642\u0637\u0627\u0631 \u062e\u0627\u0644\u06cc) \u0627\u0648\u0631 \u0688\u06cc\u0679\u0627 \u06a9\u06cc \u062a\u0635\u062f\u06cc\u0642 \u06a9\u06d2 \u0644\u06cc\u06d2 mutex \u062a\u062d\u0641\u0638 \u062f\u0631\u06a9\u0627\u0631 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-barriers\">\u0631\u06a9\u0627\u0648\u0679<\/h3>\n<p>\u0627\u06cc\u06a9 \u0631\u06a9\u0627\u0648\u0679 \u062a\u0645\u0627\u0645 \u062d\u0635\u06c1 \u0644\u06cc\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u062a\u06be\u0631\u06cc\u0688\u0632 \u06a9\u0648 \u0627\u0633 \u0648\u0642\u062a \u062a\u06a9 \u0631\u0648\u06a9\u062a\u06cc \u06c1\u06d2 \u062c\u0628 \u062a\u06a9 \u06a9\u06c1 \u062a\u0645\u0627\u0645 \u062d\u0635\u06c1 \u0644\u06cc\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u062a\u06be\u0631\u06cc\u0688\u0632 \u0631\u06a9\u0627\u0648\u0679 \u06a9\u06d2 \u0645\u0642\u0627\u0645 \u062a\u06a9 \u0646\u06c1 \u067e\u06c1\u0646\u0686 \u062c\u0627\u0626\u06cc\u06ba\u06d4 \u06cc\u06c1 \u0627\u0633 \u0648\u0642\u062a \u06a9\u0627\u0631\u0622\u0645\u062f \u06c1\u0648\u062a\u0627 \u06c1\u06d2 \u062c\u0628 \u0627\u06cc\u06a9 \u062d\u0633\u0627\u0628 \u06a9\u0648 \u0645\u062a\u0639\u062f\u062f \u0645\u0631\u0627\u062d\u0644 \u0645\u06cc\u06ba \u062a\u0642\u0633\u06cc\u0645 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u060c \u06c1\u0631 \u0642\u062f\u0645 \u06a9\u0627 \u0627\u0646\u062d\u0635\u0627\u0631 \u067e\u0686\u06be\u0644\u06d2 \u0645\u0631\u062d\u0644\u06d2 \u06a9\u06d2 \u0646\u062a\u0627\u0626\u062c \u067e\u0631 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-c\">#define NUM_WORKER_THREADS  4\n\nqurt_barrier_t sync_barrier;\n\nvoid worker_thread(void *arg)\n{\n    int thread_num = (int)(uintptr_t)arg;\n\n    \/* Phase 1: Each thread computes its portion *\/\n    printf(\"Thread %d: Computing phase 1...n\", thread_num);\n    compute_partial_result(thread_num);\n\n    \/* All threads wait here until everyone finishes phase 1 *\/\n    qurt_barrier_wait(&sync_barrier);\n\n    \/* Phase 2: All partial results are ready, combine them *\/\n    printf(\"Thread %d: Computing phase 2...n\", thread_num);\n    combine_results(thread_num);\n\n    qurt_thread_exit(QURT_EOK);\n}\n\nint main(void)\n{\n    qurt_barrier_init(&sync_barrier, NUM_WORKER_THREADS);\n\n    \/* Create worker threads *\/\n    for (int i = 0; i < NUM_WORKER_THREADS; i++) {\n        create_worker(i);\n    }\n\n    join_all_workers();\n\n    qurt_barrier_destroy(&#038;sync_barrier);\n    return 0;\n}\n<\/code><\/pre>\n<p>\u0631\u06a9\u0627\u0648\u0679 \u06a9\u0648 \u062d\u0635\u06c1 \u0644\u06cc\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u062f\u06be\u0627\u06af\u0648\u06ba \u06a9\u06cc \u062a\u0639\u062f\u0627\u062f \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0634\u0631\u0648\u0639 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u06c1\u0631 \u062a\u06be\u0631\u06cc\u0688 \u06a9\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 <code>qurt_barrier_wait()<\/code> \u062c\u0628 \u0633\u0646\u06a9\u0631\u0648\u0646\u0627\u0626\u0632\u06cc\u0634\u0646 \u067e\u0648\u0627\u0626\u0646\u0679 \u067e\u0631 \u067e\u06c1\u0646\u0686 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0645\u0627\u0645 \u062a\u06be\u0631\u06cc\u0688\u0632 \u0622\u0646\u06d2 \u062a\u06a9 \u06a9\u0627\u0644 \u0628\u0644\u0627\u06a9 \u06c1\u0648 \u062c\u0627\u062a\u06cc \u06c1\u06d2\u06d4 \u062c\u0628 \u0622\u062e\u0631\u06cc \u062a\u06be\u0631\u06cc\u0688 \u0628\u0644\u0627\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 <code>qurt_barrier_wait()<\/code>\u062a\u0645\u0627\u0645 \u062a\u06be\u0631\u06cc\u0688\u0632 \u0627\u06cc\u06a9 \u0633\u0627\u062a\u06be \u062c\u0627\u0631\u06cc \u06a9\u06cc\u06d2 \u062c\u0627\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0645\u0631\u062d\u0644\u06c1 2 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u062c\u0627\u0631\u06cc \u0631\u06c1\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-semaphores\">\u0633\u06cc\u0645\u0641\u0648\u0631<\/h3>\n<p>\u0633\u06cc\u0645\u0641\u0648\u0631\u0633 N \u0627\u06cc\u06a9 \u062c\u06cc\u0633\u06d2 \u0648\u0633\u0627\u0626\u0644 \u06a9\u06d2 \u062a\u0627\u0644\u0627\u0628 \u062a\u06a9 \u0631\u0633\u0627\u0626\u06cc \u06a9\u0648 \u06a9\u0646\u0679\u0631\u0648\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u06cc\u06a9 mutex (N=1 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u06cc\u06a9 \u0633\u06cc\u0645\u0641\u0648\u0631) \u06a9\u06d2 \u0628\u0631\u0639\u06a9\u0633\u060c \u0627\u06cc\u06a9 \u0633\u06cc\u0645\u0641\u0648\u0631 \u06a9\u0648 N \u062f\u06be\u0627\u06af\u0648\u06ba \u062a\u06a9 \u0627\u06cc\u06a9 \u0633\u0627\u062a\u06be \u0631\u06a9\u06be\u0627 \u062c\u0627 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-c\">#define MAX_DMA_CHANNELS 4\n\nqurt_sem_t dma_semaphore;\n\nvoid init_dma_pool(void)\n{\n    \/* 4 DMA channels available *\/\n    qurt_sem_init_val(&dma_semaphore, MAX_DMA_CHANNELS);\n}\n\nvoid thread_needing_dma(void *arg)\n{\n    \/* Acquire a DMA channel (blocks if all 4 are in use) *\/\n    qurt_sem_down(&dma_semaphore);\n\n    int channel = allocate_dma_channel();\n    perform_dma_transfer(channel);\n    release_dma_channel(channel);\n\n    \/* Release the semaphore slot *\/\n    qurt_sem_up(&dma_semaphore);\n\n    qurt_thread_exit(QURT_EOK);\n}\n<\/code><\/pre>\n<p>\u0633\u06cc\u0645\u0641\u0648\u0631\u0633 4 \u0633\u06d2 \u0634\u0631\u0648\u0639 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u062c\u0648 DMA \u0686\u06cc\u0646\u0644\u0632 \u06a9\u06cc \u062a\u0639\u062f\u0627\u062f \u0633\u06d2 \u0645\u0645\u0627\u062b\u0644 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u06c1\u0631 \u0627\u06cc\u06a9 <code>qurt_sem_down()<\/code> \u062c\u0628 \u06af\u0646\u062a\u06cc 0 \u062a\u06a9 \u067e\u06c1\u0646\u0686 \u062c\u0627\u0626\u06d2 \u062a\u0648 \u06af\u0646\u062a\u06cc \u06a9\u0648 \u06a9\u0645 \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 \u0628\u0644\u0627\u06a9 \u06a9\u0631\u06cc\u06ba\u06d4 <code>qurt_sem_up()<\/code> \u06af\u0646\u062a\u06cc \u0645\u06cc\u06ba \u0627\u0636\u0627\u0641\u06c1 \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 \u0627\u06af\u0631 \u0627\u0646\u062a\u0638\u0627\u0631 \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u062a\u06be\u0631\u06cc\u0688\u0632 \u06c1\u06cc\u06ba \u062a\u0648 \u0627\u06cc\u06a9 \u0648\u06cc\u0679\u0646\u06af \u062a\u06be\u0631\u06cc\u0688 \u06a9\u0648 \u063a\u06cc\u0631 \u0645\u0633\u062f\u0648\u062f \u06a9\u0631\u06cc\u06ba\u06d4 \u06cc\u06c1 \u06cc\u0642\u06cc\u0646\u06cc \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u0686\u0627\u0631 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u062a\u06be\u0631\u06cc\u0688\u0632 \u0628\u06cc\u06a9 \u0648\u0642\u062a DMA \u0686\u06cc\u0646\u0644 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u0646\u06c1 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-memory-management\">\u0645\u06cc\u0645\u0648\u0631\u06cc \u06a9\u0627 \u0627\u0646\u062a\u0638\u0627\u0645<\/h2>\n<p>\u0688\u06cc \u0627\u06cc\u0633 \u067e\u06cc \u06a9\u06cc \u06cc\u0627\u062f\u062f\u0627\u0634\u062a \u0645\u062d\u062f\u0648\u062f \u06c1\u06d2\u06d4 \u0627\u06cc\u06a9 \u0639\u0627\u0645 \u06c1\u06cc\u06a9\u0633\u0627\u06af\u0648\u0646 DSP 256KB \u0627\u0648\u0631 2MB \u06a9\u06d2 \u062f\u0631\u0645\u06cc\u0627\u0646 \u0645\u0636\u0628\u0648\u0637\u06cc \u0633\u06d2 \u062c\u0648\u0691\u06d2 \u06c1\u0648\u0626\u06d2 \u0645\u06cc\u0645\u0648\u0631\u06cc (TCM) \u0627\u0648\u0631 DDR \u062a\u06a9 \u0631\u0633\u0627\u0626\u06cc \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 QRT \u062f\u0648\u0646\u0648\u06ba \u06a9\u0648 \u0645\u0624\u062b\u0631 \u0637\u0631\u06cc\u0642\u06d2 \u0633\u06d2 \u0645\u0646\u0638\u0645 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0679\u0648\u0644\u0632 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-the-memory-map\">\u0645\u06cc\u0645\u0648\u0631\u06cc \u0646\u0642\u0634\u06c1<\/h3>\n<pre><code class=\"language-plaintext\">\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510  High Address\n\u2502         DDR (Shared with ARM)     \u2502\n\u2502   - Large buffers                 \u2502\n\u2502   - Neural network weights        \u2502\n\u2502   - Audio\/video frames            \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502         QuRT Virtual Memory       \u2502\n\u2502   - User heap                     \u2502\n\u2502   - Thread stacks                 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502         L2 Cache (TCM Mode)       \u2502\n\u2502   - Frequently accessed buffers   \u2502\n\u2502   - Lookup tables                 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502         QuRT Kernel               \u2502\n\u2502   - Scheduler, ISR handlers       \u2502\n\u2502   - System data structures        \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518  Low Address\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u062e\u0627\u06a9\u06c1 \u06c1\u06cc\u06a9\u0633\u0627\u06af\u0648\u0646 \u0688\u06cc \u0627\u06cc\u0633 \u067e\u06cc \u0645\u06cc\u0645\u0648\u0631\u06cc \u0644\u06d2 \u0622\u0624\u0679 \u06a9\u0648 \u06a9\u0645 \u0633\u06d2 \u0627\u0639\u0644\u06cc \u067e\u062a\u0648\u06ba \u062a\u06a9 \u062f\u06a9\u06be\u0627\u062a\u0627 \u06c1\u06d2\u06d4 QuRT \u06a9\u0631\u0646\u0644 \u0633\u0628 \u0633\u06d2 \u06a9\u0645 \u067e\u062a\u06c1 \u067e\u0631 \u0642\u0628\u0636\u06c1 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0635\u0627\u0631\u0641 \u06a9\u0648\u0688 \u0645\u0645\u0646\u0648\u0639 \u06c1\u06d2\u06d4 \u0627\u0633 \u06a9\u06d2 \u0627\u0648\u067e\u0631\u06cc \u062d\u0635\u06d2 \u0645\u06cc\u06ba\u060c TCM \u0645\u0648\u0688 \u0645\u06cc\u06ba \u06a9\u0646\u0641\u06cc\u06af\u0631 \u06a9\u0631\u062f\u06c1 L2 \u06a9\u06cc\u0634 \u06af\u0631\u0645 \u0688\u06cc\u0679\u0627 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062a\u06cc\u0632 \u0627\u0633\u0679\u0648\u0631\u06cc\u062c \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0648\u0631\u0686\u0648\u0626\u0644 \u0645\u06cc\u0645\u0648\u0631\u06cc \u0627\u06cc\u0631\u06cc\u0627 \u0635\u0627\u0631\u0641 \u06a9\u06d2 \u06c1\u06cc\u067e \u0627\u0648\u0631 \u062a\u06be\u0631\u06cc\u0688 \u0627\u0633\u0679\u06cc\u06a9 \u06a9\u0648 \u0631\u06a9\u06be\u062a\u0627 \u06c1\u06d2\u06d4 \u0633\u0628 \u0633\u06d2 \u0627\u0648\u067e\u0631\u060c DDR \u06a9\u0648 ARM CPU \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u0634\u062a\u0631\u0627\u06a9 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0628\u0691\u06d2 \u0688\u06cc\u0679\u0627 \u0628\u0641\u0631\u0632\u060c ML \u0645\u0627\u0688\u0644 \u06a9\u06d2 \u0648\u0632\u0646\u060c \u0627\u0648\u0631 \u0645\u06cc\u0688\u06cc\u0627 \u0641\u0631\u06cc\u0645\u0648\u06ba \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u0688\u06cc \u0688\u06cc \u0622\u0631 \u0645\u06cc\u06ba \u0679\u06cc \u0633\u06cc \u0627\u06cc\u0645 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u062a\u0627\u062e\u06cc\u0631 \u06c1\u06d2 \u0644\u06cc\u06a9\u0646 \u0627\u0633 \u06a9\u06cc \u06af\u0646\u062c\u0627\u0626\u0634 \u0628\u06c1\u062a \u0632\u06cc\u0627\u062f\u06c1 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-dynamic-memory-allocation\">\u0645\u062a\u062d\u0631\u06a9 \u0645\u06cc\u0645\u0648\u0631\u06cc \u0645\u062e\u062a\u0635 \u06a9\u0631\u0646\u0627<\/h3>\n<pre><code class=\"language-c\">#include <qurt.h>\n#include <stdlib.h>\n\nvoid memory_examples(void)\n{\n    \/* Standard malloc\/free works (QuRT provides a heap) *\/\n    int *data = (int *)malloc(1024 * sizeof(int));\n    if (!data) {\n        printf(\"malloc failed! Out of heap memory.n\");\n        return;\n    }\n\n    for (int i = 0; i < 1024; i++) {\n        data[i] = i * 2;\n    }\n\n    free(data);\n}\n<\/stdlib.h><\/qurt.h><\/code><\/pre>\n<p>QRT \u0627\u06cc\u06a9 \u0645\u0639\u06cc\u0627\u0631\u06cc C \u06c1\u06cc\u067e \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0644\u06c1\u0630\u0627 <code>malloc<\/code> \u0627\u0648\u0631 <code>free<\/code> \u06cc\u06c1 \u062a\u0648\u0642\u0639 \u06a9\u06d2 \u0645\u0637\u0627\u0628\u0642 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0644\u06cc\u06a9\u0646 <code>malloc<\/code> \u0639\u0645\u0644 \u062f\u0631\u0622\u0645\u062f \u06a9\u0627 \u0648\u0642\u062a \u063a\u06cc\u0631 \u0645\u062a\u0648\u0642\u0639 \u06c1\u06d2 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u0627\u0633\u06d2 \u0645\u0641\u062a \u0641\u06c1\u0631\u0633\u062a \u062a\u0644\u0627\u0634 \u06a9\u0631\u0646\u06d2\u060c \u0628\u0644\u0627\u06a9\u0633 \u062a\u0642\u0633\u06cc\u0645 \u06a9\u0631\u0646\u06d2\u060c \u06cc\u0627 \u0645\u0644\u062d\u0642\u06c1 \u0622\u0632\u0627\u062f \u0639\u0644\u0627\u0642\u0648\u06ba \u06a9\u0648 \u0636\u0645 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u067e\u0691 \u0633\u06a9\u062a\u06cc \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0631\u06cc\u0626\u0644 \u0679\u0627\u0626\u0645 \u06c1\u0627\u0679 \u067e\u0627\u062a\u06be\u0632 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0646\u0627\u0645\u0646\u0627\u0633\u0628 \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2 \u062c\u06c1\u0627\u06ba \u067e\u0631 \u0639\u0645\u0644 \u062f\u0631\u0622\u0645\u062f \u06a9\u0627 \u0648\u0642\u062a \u0645\u0642\u0631\u0631\u06c1 \u06c1\u0648\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u06d4 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba <code>malloc<\/code> \u06cc\u06c1 \u0622\u0646 \u0627\u0648\u0631 \u0622\u0641 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06c1\u06d2\u060c \u0641\u06cc \u0641\u0631\u06cc\u0645 \u06cc\u0627 \u0641\u06cc \u0646\u0645\u0648\u0646\u06c1 \u0645\u062e\u062a\u0635 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0646\u06c1\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-cache-management\">\u06a9\u06cc\u0634 \u0645\u06cc\u0646\u062c\u0645\u0646\u0679<\/h3>\n<p>Hexagon DSP \u0645\u06cc\u06ba\u060c ARM CPU \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0645\u06cc\u0645\u0648\u0631\u06cc \u06a9\u0627 \u0627\u0634\u062a\u0631\u0627\u06a9 \u06a9\u0631\u062a\u06d2 \u0648\u0642\u062a \u0648\u0627\u0636\u062d \u06a9\u06cc\u0634\u06d2 \u06a9\u0627 \u0627\u0646\u062a\u0638\u0627\u0645 \u0636\u0631\u0648\u0631\u06cc \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-c\">#include <qurt.h>\n\nvoid cache_management_example(void)\n{\n    void *buffer;\n    size_t buffer_size = 4096;\n\n    \/* Allocate physically contiguous, cache-aligned memory *\/\n    int result = qurt_mem_region_create(\n        &buffer,\n        buffer_size,\n        qurt_mem_default_pool,\n        QURT_MEM_REGION_SHARED\n    );\n\n    if (result != QURT_EOK) {\n        printf(\"Memory region creation failedn\");\n        return;\n    }\n\n    \/* BEFORE reading data written by another processor (e.g., ARM): *\/\n    qurt_mem_cache_clean(buffer, buffer_size,\n                          QURT_MEM_CACHE_INVALIDATE);\n\n    \/* Read data from the buffer... *\/\n\n    \/* AFTER writing data that another processor will read: *\/\n    fill_buffer_with_results(buffer, buffer_size);\n    qurt_mem_cache_clean(buffer, buffer_size,\n                          QURT_MEM_CACHE_FLUSH);\n}\n<\/qurt.h><\/code><\/pre>\n<p>\u06a9\u06c1 <code>qurt_mem_region_create()<\/code> \u06a9\u0627\u0644 \u062f\u0648\u0633\u0631\u06d2 \u067e\u0631\u0648\u0633\u06cc\u0633\u0631\u0632 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u0634\u062a\u0631\u0627\u06a9 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u0648\u0632\u0648\u06ba \u0645\u06cc\u0645\u0648\u0631\u06cc \u06a9\u0627 \u0627\u06cc\u06a9 \u062c\u0633\u0645\u0627\u0646\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0645\u062a\u0635\u0644 \u0639\u0644\u0627\u0642\u06c1 \u0645\u062e\u062a\u0635 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4 \u06a9\u06c1 <code>QURT_MEM_REGION_SHARED<\/code> \u06a9\u0631\u0627\u0633 \u067e\u0631\u0648\u0633\u06cc\u0633\u0631 \u06a9\u06d2 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u062c\u06be\u0646\u0688\u0627 \u0627\u0633 \u06a9\u0648 \u0646\u0634\u0627\u0646 \u0632\u062f \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0645\u0634\u062a\u0631\u06a9\u06c1 \u0645\u06cc\u0645\u0648\u0631\u06cc \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u06cc\u0634\u06d2 \u06a9\u06d2 \u0627\u0635\u0648\u0644 \u0633\u0627\u062f\u06c1 \u0644\u06cc\u06a9\u0646 \u0627\u06c1\u0645 \u06c1\u06cc\u06ba\u06d4<\/p>\n<ol>\n<li>\n<p><strong>\u0628\u062f\u06af\u0645\u0627\u0646\u06cc<\/strong> \u0622\u067e \u06a9\u06d2 \u0633\u0627\u0645\u0646\u06d2 <strong>\u067e\u0691\u06be\u06cc\u06ba<\/strong>\u06cc\u06c1 \u0627\u0633 \u0628\u0627\u062a \u06a9\u0648 \u06cc\u0642\u06cc\u0646\u06cc \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u0622\u067e \u067e\u0631\u0627\u0646\u06d2 \u06a9\u06cc\u0634 \u0627\u0646\u062f\u0631\u0627\u062c\u0627\u062a \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 ARM CPU \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0644\u06a9\u06be\u0627 \u06c1\u0648\u0627 \u062a\u0627\u0632\u06c1 \u062a\u0631\u06cc\u0646 \u0688\u06cc\u0679\u0627 \u062f\u06cc\u06a9\u06be\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p><strong>\u0641\u0644\u0634<\/strong> \u0622\u067e \u06a9\u06d2 \u0628\u0639\u062f <strong>\u0644\u06a9\u06be\u0646\u0627<\/strong>\u0644\u06c1\u0630\u0627 ARM CPU \u062a\u0628\u062f\u06cc\u0644\u06cc\u0648\u06ba \u06a9\u0648 \u062f\u06cc\u06a9\u06be\u062a\u0627 \u06c1\u06d2\u060c \u0646\u06c1 \u06a9\u06c1 \u0645\u06cc\u0646 \u0645\u06cc\u0645\u0648\u0631\u06cc \u06a9\u06d2 \u067e\u0686\u06be\u0644\u06d2 \u0645\u0648\u0627\u062f \u06a9\u0648\u06d4<\/p>\n<\/li>\n<\/ol>\n<p>\u0627\u06cc\u0633\u0627 \u06a9\u0631\u0646\u0627 \u0628\u06be\u0648\u0644 \u062c\u0627\u0646\u06d2 \u0633\u06d2 \u0622\u067e \u06a9\u06d2 \u06a9\u0648\u0688 \u0645\u06cc\u06ba \u06a9\u06cc\u0691\u06d2 \u067e\u06cc\u062f\u0627 \u06c1\u0648 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba \u062c\u0648 \u0645\u0646\u0637\u0642\u06cc \u0637\u0648\u0631 \u067e\u0631 \u062f\u0631\u0633\u062a \u06c1\u06cc\u06ba \u0644\u06cc\u06a9\u0646 \u067e\u0631\u0627\u0646\u06d2 \u0688\u06cc\u0679\u0627 \u067e\u0631 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-memory-pools-for-predictable-allocation\">\u067e\u06cc\u0634 \u0642\u06cc\u0627\u0633\u06cc \u0645\u062e\u062a\u0635 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u06cc\u0645\u0648\u0631\u06cc \u067e\u0648\u0644<\/h3>\n<p>\u0645\u06cc\u0645\u0648\u0631\u06cc \u067e\u0648\u0644\u0632 O(1) \u0645\u062e\u062a\u0635 \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u0648\u0642\u062a \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u062c\u0648 \u0627\u0646\u06c1\u06cc\u06ba \u062d\u0642\u06cc\u0642\u06cc \u0648\u0642\u062a \u06a9\u06d2 \u06af\u0631\u0645 \u0631\u0627\u0633\u062a\u0648\u06ba \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u0648\u0632\u0648\u06ba \u0628\u0646\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-c\">#include <qurt.h>\n\n#define BLOCK_SIZE    256\n#define NUM_BLOCKS    32\n\n\/* Pool memory is statically allocated for determinism *\/\nstatic char pool_memory[BLOCK_SIZE * NUM_BLOCKS] __attribute__((aligned(8)));\nstatic qurt_mem_pool_t my_pool;\n\nvoid pool_init(void)\n{\n    qurt_mem_pool_create(&my_pool, pool_memory,\n                          BLOCK_SIZE * NUM_BLOCKS,\n                          BLOCK_SIZE);\n}\n\nvoid *pool_alloc(void)\n{\n    void *block = qurt_mem_pool_alloc(&my_pool);\n    if (!block) {\n        printf(\"Pool exhausted!n\");\n    }\n    return block;\n}\n\nvoid pool_free(void *block)\n{\n    qurt_mem_pool_free(&my_pool, block);\n}\n<\/qurt.h><\/code><\/pre>\n<p>\u06cc\u06c1 \u06a9\u0648\u0688 32 \u0628\u0644\u0627\u06a9\u0633 \u06a9\u0627 \u0627\u06cc\u06a9 \u067e\u0648\u0644 \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2\u060c \u06c1\u0631 \u0628\u0644\u0627\u06a9 256 \u0628\u0627\u0626\u0679\u0633 \u06a9\u0627 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4 \u067e\u0648\u0644 \u0645\u06cc\u0645\u0648\u0631\u06cc \u06a9\u0648 \u0645\u0633\u062a\u062d\u06a9\u0645 \u0637\u0648\u0631 \u067e\u0631 \u0645\u062e\u062a\u0635 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2 \u062a\u0627\u06a9\u06c1 \u0627\u0646\u062d\u0635\u0627\u0631 \u0633\u06d2 \u0628\u0686 \u0633\u06a9\u06cc\u06ba: <code>malloc<\/code> \u0631\u0646 \u0679\u0627\u0626\u0645 \u067e\u0631\u06d4<\/p>\n<p><code>qurt_mem_pool_alloc()<\/code>    \u0627\u06cc\u06a9 \u062e\u0627\u0635 \u0648\u0642\u062a \u067e\u0631 \u0627\u06cc\u06a9 \u0628\u0644\u0627\u06a9 \u0648\u0627\u067e\u0633 \u06a9\u0631\u06cc\u06ba\u060c <code>qurt_mem_pool_free()<\/code> \u0627\u06cc\u06a9 \u062e\u0627\u0635 \u0648\u0642\u062a \u067e\u0631 \u0648\u0627\u067e\u0633\u06cc \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4 \u062c\u0628 \u067e\u0648\u0644 \u062e\u062a\u0645 \u06c1\u0648 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u060c \u0645\u062e\u062a\u0635\u0627\u062a \u06a9\u0633\u06cc \u0627\u0648\u0631 \u062c\u06af\u06c1 \u0645\u06cc\u0645\u0648\u0631\u06cc \u06a9\u0648 \u0628\u0644\u0627\u06a9 \u06a9\u0631\u0646\u06d2 \u06cc\u0627 \u0628\u0627\u0632\u06cc\u0627\u0641\u062a \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 NULL \u0644\u0648\u0679\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u06cc\u06c1 \u0639\u0632\u0645\u06cc\u062a \u0645\u06cc\u0645\u0648\u0631\u06cc \u067e\u0648\u0644\u0632 \u06a9\u0648 \u0622\u0688\u06cc\u0648 \u067e\u0631\u0648\u0633\u06cc\u0633\u0646\u06af \u0644\u0648\u067e\u0633\u060c \u0633\u06cc\u0646\u0633\u0631 \u0688\u06cc\u0679\u0627 \u06c1\u06cc\u0646\u0688\u0644\u0631\u0632\u060c \u0627\u0648\u0631 \u062f\u0648\u0633\u0631\u06d2 \u06a9\u0648\u0688 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u0627\u0686\u06be\u0627 \u0627\u0646\u062a\u062e\u0627\u0628 \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2 \u062c\u0648 \u0633\u062e\u062a \u0688\u06cc\u0688 \u0644\u0627\u0626\u0646 \u06a9\u06d2 \u062a\u062d\u062a \u0686\u0644\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-timers-and-timing\">\u0679\u0627\u0626\u0645\u0631 \u0627\u0648\u0631 \u0679\u0627\u0626\u0645\u0646\u06af<\/h2>\n<p>QRT \u062f\u0631\u0633\u062a \u0648\u0642\u062a \u06a9\u06d2 \u0644\u06cc\u06d2 \u06c1\u0627\u0631\u0688 \u0648\u06cc\u0626\u0631 \u0633\u06d2 \u0645\u0639\u0627\u0648\u0646 \u0679\u0627\u0626\u0645\u0631 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0688\u06cc \u0627\u06cc\u0633 \u067e\u06cc \u0622\u067e\u0631\u06cc\u0634\u0646\u0632 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06cc\u06c1 \u0628\u06c1\u062a \u0636\u0631\u0648\u0631\u06cc \u06c1\u06d2\u06d4 48 kHz \u067e\u0631 \u0622\u0688\u06cc\u0648 \u067e\u0631\u0648\u0633\u06cc\u0633\u0646\u06af \u06a9\u06d2 \u0644\u06cc\u06d2 \u06c1\u0631 10.67 \u0645\u0644\u06cc \u0633\u06cc\u06a9\u0646\u0688 \u0628\u0639\u062f \u0627\u06cc\u06a9 \u0646\u06cc\u0627 \u0628\u0641\u0631 \u062f\u0631\u06a9\u0627\u0631 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u060c \u0628\u063a\u06cc\u0631 \u06a9\u0633\u06cc \u0627\u0633\u062a\u062b\u0646\u0627 \u06a9\u06d2\u06d4<\/p>\n<h3 id=\"heading-one-shot-timer\">\u0627\u06cc\u06a9 \u0634\u0627\u0679 \u0679\u0627\u0626\u0645\u0631<\/h3>\n<pre><code class=\"language-c\">#include <qurt.h>\n#include <qurt_timer.h>\n\nqurt_timer_t my_timer;\nqurt_signal_t timer_signal;\n\n#define TIMER_EXPIRED_SIGNAL  0x01\n\nvoid timer_example(void)\n{\n    qurt_signal_init(&timer_signal);\n\n    qurt_timer_attr_t attr;\n    qurt_timer_attr_init(&attr);\n\n    \/* Set timer duration: 10 milliseconds *\/\n    qurt_timer_attr_set_duration(&attr,\n        qurt_timer_convert_time_to_ticks(10000,  \/* microseconds *\/\n                                          QURT_TIME_USEC));\n\n    \/* Set the signal to fire when timer expires *\/\n    qurt_timer_attr_set_signal(&attr, &timer_signal);\n    qurt_timer_attr_set_signal_mask(&attr, TIMER_EXPIRED_SIGNAL);\n\n    \/* One-shot: fires once *\/\n    qurt_timer_attr_set_type(&attr, QURT_TIMER_ONESHOT);\n\n    \/* Create and start the timer *\/\n    qurt_timer_create(&my_timer, &attr);\n\n    \/* Wait for the timer to expire *\/\n    qurt_signal_wait(&timer_signal,\n                      TIMER_EXPIRED_SIGNAL,\n                      QURT_SIGNAL_ATTR_WAIT_ANY);\n\n    printf(\"Timer expired! 10ms have passed.n\");\n    qurt_signal_clear(&timer_signal, TIMER_EXPIRED_SIGNAL);\n\n    \/* Clean up *\/\n    qurt_timer_delete(my_timer);\n    qurt_signal_destroy(&timer_signal);\n}\n<\/qurt_timer.h><\/qurt.h><\/code><\/pre>\n<p>\u06cc\u06c1 \u0627\u06cc\u06a9 \u0634\u0627\u0679 \u0679\u0627\u0626\u0645\u0631 \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2 \u062c\u0648 10 \u0645\u0644\u06cc \u0633\u06cc\u06a9\u0646\u0688 \u06a9\u06d2 \u0628\u0639\u062f \u0686\u0644\u062a\u0627 \u06c1\u06d2\u06d4 \u0679\u0627\u0626\u0645\u0631 \u0645\u062f\u062a\u060c \u0633\u06af\u0646\u0644 \u0622\u0628\u062c\u06cc\u06a9\u0679 \u062c\u0633 \u06a9\u0648 \u0645\u0637\u0644\u0639 \u06a9\u06cc\u0627 \u062c\u0627\u0626\u06d2\u060c \u0633\u06cc\u0679 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0633\u06af\u0646\u0644 \u0628\u0679 \u0645\u0627\u0633\u06a9\u060c \u0627\u0648\u0631 \u0679\u0627\u0626\u0645\u0631 \u06a9\u06cc \u0642\u0633\u0645 (<code>QURT_TIMER_ONESHOT<\/code>)\u06d4 \u0679\u0627\u0626\u0645\u0631 \u06a9\u06cc \u0645\u06cc\u0639\u0627\u062f \u062e\u062a\u0645 \u06c1\u0648\u0646\u06d2 \u067e\u0631\u060c \u0645\u062e\u0635\u0648\u0635 \u0633\u06af\u0646\u0644 \u0628\u0679 \u0633\u06cc\u0679 \u06a9\u0631\u06a9\u06d2 \u0645\u0633\u062f\u0648\u062f \u062f\u06be\u0627\u06af\u06d2 \u06a9\u0648 \u062c\u06af\u0627 \u062f\u06cc\u06ba\u06d4 <code>qurt_signal_wait()<\/code>. \u0627\u06cc\u0648\u0646\u0679 \u067e\u0631 \u06a9\u0627\u0631\u0631\u0648\u0627\u0626\u06cc \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f\u060c \u062f\u06be\u0627\u06af\u06c1 \u0633\u06af\u0646\u0644 \u06a9\u0648 \u0635\u0627\u0641 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0679\u0627\u0626\u0645\u0631 \u06a9\u0648 \u0635\u0627\u0641 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-periodic-timer\">\u0645\u062a\u0648\u0627\u062a\u0631 \u0679\u0627\u0626\u0645\u0631<\/h3>\n<pre><code class=\"language-c\">void periodic_timer_thread(void *arg)\n{\n    qurt_timer_t periodic_timer;\n    qurt_signal_t periodic_signal;\n    qurt_timer_attr_t attr;\n\n    qurt_signal_init(&periodic_signal);\n    qurt_timer_attr_init(&attr);\n\n    \/* Fire every 1 millisecond *\/\n    qurt_timer_attr_set_duration(&attr,\n        qurt_timer_convert_time_to_ticks(1000, QURT_TIME_USEC));\n    qurt_timer_attr_set_signal(&attr, &periodic_signal);\n    qurt_timer_attr_set_signal_mask(&attr, 0x01);\n    qurt_timer_attr_set_type(&attr, QURT_TIMER_PERIODIC);\n\n    qurt_timer_create(&periodic_timer, &attr);\n\n    int iteration = 0;\n    while (iteration < 1000) {\n        qurt_signal_wait(&#038;periodic_signal, 0x01,\n                          QURT_SIGNAL_ATTR_WAIT_ANY);\n        qurt_signal_clear(&#038;periodic_signal, 0x01);\n\n        \/* This runs every 1ms *\/\n        process_audio_frame(iteration);\n        iteration++;\n    }\n\n    qurt_timer_delete(periodic_timer);\n    qurt_signal_destroy(&#038;periodic_signal);\n    qurt_thread_exit(QURT_EOK);\n}\n<\/code><\/pre>\n<p>\u0627\u06cc\u06a9 \u0645\u062a\u0648\u0627\u062a\u0631 \u0679\u0627\u0626\u0645\u0631 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2: <code>QURT_TIMER_PERIODIC<\/code> \u0627\u0633 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 <code>QURT_TIMER_ONESHOT<\/code>. \u0645\u062e\u0635\u0648\u0635 \u0648\u0642\u0641\u0648\u06ba \u067e\u0631 \u0628\u0627\u0631 \u0628\u0627\u0631 \u0622\u06af \u0644\u06af\u062a\u06cc \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0645\u062b\u0627\u0644 1ms \u06a9\u06d2 \u0648\u0642\u0641\u0648\u06ba \u06a9\u06d2 \u0633\u0627\u062a\u06be 1000 \u062a\u06a9\u0631\u0627\u0631 \u06a9\u0648 \u0627\u0646\u062c\u0627\u0645 \u062f\u06d2 \u06a9\u0631 \u0641\u06cc \u0679\u06a9 \u0627\u06cc\u06a9 \u0622\u0688\u06cc\u0648 \u0641\u0631\u06cc\u0645 \u067e\u0631 \u06a9\u0627\u0631\u0631\u0648\u0627\u0626\u06cc \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4 \u06c1\u0631 \u062a\u06a9\u0631\u0627\u0631 \u06a9\u06d2 \u0628\u0639\u062f \u06cc\u0627 \u0627\u06af\u0644\u06cc \u062a\u06a9\u0631\u0627\u0631 \u06a9\u06d2 \u0628\u0639\u062f \u0633\u06af\u0646\u0644 \u06a9\u0648 \u0635\u0627\u0641 \u06a9\u0631\u0646\u0627 \u0636\u0631\u0648\u0631\u06cc \u06c1\u06d2\u06d4 <code>qurt_signal_wait()<\/code> \u0641\u0648\u0631\u0627\u064b \u0648\u0627\u067e\u0633 \u0622\u062c\u0627\u0626\u06d2 \u06af\u0627\u06d4<\/p>\n<h3 id=\"heading-reading-the-current-time\">\u0645\u0648\u062c\u0648\u062f\u06c1 \u0648\u0642\u062a \u067e\u0691\u06be\u06cc\u06ba<\/h3>\n<pre><code class=\"language-c\">void timing_example(void)\n{\n    unsigned long long start_ticks = qurt_sysclock_get_hw_ticks();\n\n    heavy_computation();\n\n    unsigned long long end_ticks = qurt_sysclock_get_hw_ticks();\n    unsigned long long elapsed_ticks = end_ticks - start_ticks;\n\n    unsigned long long elapsed_us =\n        qurt_timer_convert_ticks_to_time(elapsed_ticks, QURT_TIME_USEC);\n\n    printf(\"Computation took %llu microsecondsn\", elapsed_us);\n}\n<\/code><\/pre>\n<p><code>qurt_sysclock_get_hw_ticks()<\/code>    \u06c1\u0627\u0631\u0688\u0648\u06cc\u0626\u0631 \u0633\u0627\u0626\u06cc\u06a9\u0644 \u06a9\u0627\u0624\u0646\u0679\u0631 \u06a9\u0648 \u067e\u0691\u06be\u062a\u0627 \u06c1\u06d2\u060c \u062c\u0648 DSP \u0645\u06cc\u06ba \u062f\u0633\u062a\u06cc\u0627\u0628 \u0627\u0639\u0644\u06cc \u062a\u0631\u06cc\u0646 \u0631\u06cc\u0632\u0648\u0644\u0648\u0634\u0646 \u0679\u0627\u0626\u0645\u0646\u06af \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 <code>qurt_timer_convert_ticks_to_time()<\/code> \u062e\u0627\u0645 \u0679\u06a9 \u06a9\u0648 \u0627\u0646\u0633\u0627\u0646\u06cc \u067e\u0691\u06be\u0646\u06d2 \u06a9\u06d2 \u0642\u0627\u0628\u0644 \u0627\u06a9\u0627\u0626\u06cc\u0648\u06ba \u0645\u06cc\u06ba \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u06cc\u06ba\u060c \u0627\u0633 \u0635\u0648\u0631\u062a \u0645\u06cc\u06ba \u0645\u0627\u0626\u06cc\u06a9\u0631\u0648 \u0633\u06cc\u06a9\u0646\u0688\u0632\u06d4 \u0627\u0646\u0641\u0631\u0627\u062f\u06cc \u062e\u0635\u0648\u0635\u06cc\u0627\u062a \u06a9\u0648 \u067e\u0631\u0648\u0641\u0627\u0626\u0644 \u06a9\u0631\u0646\u06d2 \u0627\u0648\u0631 \u06a9\u0627\u0631\u06a9\u0631\u062f\u06af\u06cc \u06a9\u06cc \u0631\u06a9\u0627\u0648\u0679\u0648\u06ba \u06a9\u06cc \u0646\u0634\u0627\u0646\u062f\u06c1\u06cc \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0633 \u067e\u06cc\u0679\u0631\u0646 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-interrupt-handling\">\u06c1\u06cc\u0646\u0688\u0644\u0646\u06af \u0645\u06cc\u06ba \u062e\u0644\u0644 \u0688\u0627\u0644\u0646\u0627<\/h2>\n<p>\u0688\u06cc \u0627\u06cc\u0633 \u067e\u06cc \u0645\u06cc\u06ba\u060c \u0631\u06a9\u0627\u0648\u0679 \u06c1\u0627\u0631\u0688 \u0648\u06cc\u0626\u0631 \u06a9\u0627 \u0627\u0634\u0627\u0631\u06c1 \u062f\u06cc\u0646\u06d2 \u06a9\u0627 \u0637\u0631\u06cc\u0642\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u0627\u0633\u06d2 \u062a\u0648\u062c\u06c1 \u062f\u06cc\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u06d4 QRT \u0646\u0646\u06af\u06d2 \u062f\u06be\u0627\u062a\u06cc ISR \u06c1\u06cc\u0646\u0688\u0644\u0631\u0632 \u06a9\u06d2 \u0645\u0642\u0627\u0628\u0644\u06d2 \u0645\u06cc\u06ba \u062f\u06be\u0627\u06af\u06d2 \u067e\u0631 \u0645\u0628\u0646\u06cc \u0627\u06cc\u06a9 \u0632\u06cc\u0627\u062f\u06c1 \u0633\u0627\u062e\u062a\u06cc \u0645\u062f\u0627\u062e\u0644\u062a \u06a9\u0627 \u0645\u0627\u0688\u0644 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-c\">#include <qurt.h>\n#include <qurt_interrupt.h>\n\n#define MY_SENSOR_IRQ      42\n#define IRQ_SIGNAL         0x01\n\nstatic qurt_signal_t irq_signal;\n\nvoid sensor_isr_thread(void *arg)\n{\n    int irq = MY_SENSOR_IRQ;\n\n    \/* Register this thread as the handler for IRQ 42 *\/\n    qurt_interrupt_register(irq, &irq_signal, IRQ_SIGNAL);\n\n    printf(\"Sensor ISR thread ready, waiting for interrupts...n\");\n\n    while (1) {\n        \/* Block until the hardware interrupt fires *\/\n        unsigned int sigs = qurt_signal_wait(\n            &irq_signal, IRQ_SIGNAL, QURT_SIGNAL_ATTR_WAIT_ANY);\n\n        if (sigs & IRQ_SIGNAL) {\n            qurt_signal_clear(&irq_signal, IRQ_SIGNAL);\n\n            \/* Read sensor data quickly *\/\n            int sensor_value = read_sensor_register();\n\n            \/* Put data in a queue for the processing thread *\/\n            enqueue_sensor_data(sensor_value);\n\n            \/* Signal the processing thread *\/\n            qurt_signal_set(&processing_signal, DATA_READY);\n\n            \/* Re-enable the interrupt *\/\n            qurt_interrupt_acknowledge(irq);\n        }\n    }\n}\n<\/qurt_interrupt.h><\/qurt.h><\/code><\/pre>\n<p>QRT ISR \u0646\u0646\u06af\u06cc \u062f\u06be\u0627\u062a\u06cc ISR \u0633\u06d2 \u0645\u062e\u062a\u0644\u0641 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0627\u06cc\u06a9 \u0633\u0631\u0634\u0627\u0631 \u062f\u06be\u0627\u06af\u06d2 \u06a9\u06d2 \u0633\u06cc\u0627\u0642 \u0648 \u0633\u0628\u0627\u0642 \u0645\u06cc\u06ba \u0686\u0644\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 \u06a9\u06c1 \u0622\u067e \u0627\u0646\u062f\u0631\u0648\u0646\u06cc \u0637\u0648\u0631 \u067e\u0631 mutexes \u0627\u0648\u0631 \u0633\u06af\u0646\u0644\u0632 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u062a\u0627\u06c1\u0645\u060c ISR \u062a\u06be\u0631\u06cc\u0688 \u06a9\u0648 \u0627\u0628\u06be\u06cc \u0628\u06be\u06cc \u06a9\u0645 \u0633\u06d2 \u06a9\u0645 \u06a9\u0627\u0645 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u06d4 \u06cc\u0639\u0646\u06cc\u060c \u0627\u0633\u06d2 \u06c1\u0627\u0631\u0688 \u0648\u06cc\u0626\u0631 \u06a9\u06d2 \u0631\u062c\u0633\u0679\u0631 \u067e\u0691\u06be\u0646\u0627\u060c \u0642\u0637\u0627\u0631 \u0645\u06cc\u06ba \u0688\u06cc\u0679\u0627 \u0634\u0627\u0645\u0644 \u06a9\u0631\u0646\u0627\u060c \u0633\u06af\u0646\u0644 \u067e\u0631\u0648\u0633\u06cc\u0633\u0646\u06af \u062a\u06be\u0631\u06cc\u0688\u0632\u060c \u0627\u0648\u0631 \u0631\u06a9\u0627\u0648\u0679\u0648\u06ba \u06a9\u0648 \u062a\u0633\u0644\u06cc\u0645 \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u06d4 \u06a9\u0648\u0626\u06cc \u0628\u06be\u06cc \u0645\u06c1\u0646\u06af\u0627 \u062d\u0633\u0627\u0628 \u0627\u0644\u06af\u060c \u06a9\u0645 \u062a\u0631\u062c\u06cc\u062d\u06cc \u067e\u0631\u0648\u0633\u06cc\u0633\u0646\u06af \u062a\u06be\u0631\u06cc\u0688 \u0645\u06cc\u06ba \u06a9\u06cc\u0627 \u062c\u0627\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u06d4<\/p>\n<pre><code class=\"language-plaintext\">Hardware IRQ\n     \u2502\n     \u25bc\nISR Thread (high priority)     Processing Thread (medium priority)\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510          \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 Read HW register \u2502          \u2502 Wait for DATA_READY      \u2502\n\u2502 Enqueue data     \u2502 \u2500\u2500\u2500\u2500\u2500\u2500\u25ba  \u2502 Dequeue data             \u2502\n\u2502 Signal \"ready\"   \u2502          \u2502 Run FFT \/ filter \/ etc.  \u2502\n\u2502 ACK interrupt    \u2502          \u2502 Write results            \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518          \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u062e\u0627\u06a9\u06c1 ISR \u0622\u0641 \u0644\u0648\u0688\u0646\u06af \u067e\u06cc\u0679\u0631\u0646 \u06a9\u0648 \u062f\u06a9\u06be\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u0628\u0627\u0626\u06cc\u06ba \u0637\u0631\u0641 \u06a9\u0627 ISR \u062f\u06be\u0627\u06af\u06c1 \u06a9\u0645 \u0633\u06d2 \u06a9\u0645 \u062a\u0627\u062e\u06cc\u0631 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u06c1\u0627\u0631\u0688\u0648\u06cc\u0626\u0631 \u0645\u062f\u0627\u062e\u0644\u062a \u06a9\u0648 \u06c1\u06cc\u0646\u0688\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0633\u06cc\u0646\u0633\u0631 \u06a9\u06d2 \u0631\u062c\u0633\u0679\u0631\u0648\u06ba \u06a9\u0648 \u067e\u0691\u06be\u062a\u0627 \u06c1\u06d2\u060c \u0642\u0637\u0627\u0631 \u0645\u06cc\u06ba \u062e\u0627\u0645 \u0688\u06cc\u0679\u0627 \u0634\u0627\u0645\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u062f\u06be\u0627\u06af\u0648\u06ba \u06a9\u06cc \u067e\u0631\u0648\u0633\u06cc\u0633\u0646\u06af \u06a9\u0648 \u0633\u06af\u0646\u0644 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0631\u06a9\u0627\u0648\u0679\u0648\u06ba \u06a9\u0648 \u062a\u0633\u0644\u06cc\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062a\u0627\u06a9\u06c1 \u0648\u06c1 \u062f\u0648\u0628\u0627\u0631\u06c1 \u06a9\u0627\u0645 \u06a9\u0631 \u0633\u06a9\u06cc\u06ba\u06d4 \u062f\u0627\u0626\u06cc\u06ba \u0637\u0631\u0641 \u067e\u0631\u0648\u0633\u06cc\u0633\u0646\u06af \u062a\u06be\u0631\u06cc\u0688 \u0645\u06c1\u0646\u06af\u06d2 \u0622\u067e\u0631\u06cc\u0634\u0646\u0632 (FFT\u060c \u0641\u0644\u0679\u0631\u0646\u06af\u060c ML inference) \u06a9\u0648 \u06a9\u0645 \u062a\u0631\u062c\u06cc\u062d \u067e\u0631 \u0627\u0646\u062c\u0627\u0645 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u06cc\u06c1 \u0688\u06cc\u0632\u0627\u0626\u0646 \u0627\u0633 \u0628\u0627\u062a \u06a9\u0648 \u06cc\u0642\u06cc\u0646\u06cc \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 ISR \u062a\u06be\u0631\u06cc\u0688 \u0627\u06af\u0644\u06d2 \u06c1\u0627\u0631\u0688 \u0648\u06cc\u0626\u0631 \u0645\u06cc\u06ba \u0631\u06a9\u0627\u0648\u0679 \u06a9\u06cc \u062e\u062f\u0645\u062a \u06a9\u06d2 \u0644\u06cc\u06d2 \u06c1\u0645\u06cc\u0634\u06c1 \u062f\u0633\u062a\u06cc\u0627\u0628 \u06c1\u06d2\u060c \u0686\u0627\u06c1\u06d2 \u067e\u0631\u0648\u0633\u06cc\u0633\u0646\u06af \u062a\u06be\u0631\u06cc\u0688\u0632 \u067e\u0686\u06be\u0644\u06d2 \u0646\u0645\u0648\u0646\u06d2 \u0633\u06d2 \u06a9\u0627\u0645 \u06a9\u0631 \u0631\u06c1\u06d2 \u06c1\u0648\u06ba\u06d4<\/p>\n<h2 id=\"heading-pipes-and-message-queues\">\u067e\u0627\u0626\u067e \u0627\u0648\u0631 \u067e\u06cc\u063a\u0627\u0645 \u06a9\u06cc \u0642\u0637\u0627\u0631<\/h2>\n<p>QRT \u0645\u062d\u0641\u0648\u0638\u060c \u0633\u0679\u0631\u06a9\u0686\u0631\u0688 \u0627\u0646\u0679\u0631 \u062a\u06be\u0631\u06cc\u0688 \u06a9\u0645\u06cc\u0648\u0646\u06cc\u06a9\u06cc\u0634\u0646 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0628\u0644\u0679 \u0627\u0646 \u067e\u0627\u0626\u067e \u0633\u067e\u0648\u0631\u0679 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u067e\u0627\u0626\u067e \u0627\u06cc\u06a9 \u0645\u0642\u0631\u0631\u06c1 \u0633\u0627\u0626\u0632 \u06a9\u06d2 \u067e\u06cc\u063a\u0627\u0645 \u06a9\u06cc \u0642\u0637\u0627\u0631 \u06c1\u06d2 \u062c\u0648 \u0628\u06be\u06cc\u062c\u0646\u06d2 \u0627\u0648\u0631 \u0648\u0635\u0648\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u06a9\u0627\u0631\u0631\u0648\u0627\u0626\u06cc\u0648\u06ba \u06a9\u0648 \u0631\u0648\u06a9\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-c\">#include <qurt.h>\n#include <qurt_pipe.h>\n\n#define PIPE_ELEMENTS   16\n#define ELEMENT_SIZE    sizeof(sensor_msg_t)\n\ntypedef struct {\n    int sensor_id;\n    int value;\n    unsigned long long timestamp;\n} sensor_msg_t;\n\n\/* Pipe buffer must be allocated by you *\/\nstatic char pipe_buffer[PIPE_ELEMENTS * ELEMENT_SIZE]\n    __attribute__((aligned(8)));\n\nqurt_pipe_t sensor_pipe;\n\nvoid pipe_init(void)\n{\n    qurt_pipe_attr_t attr;\n    qurt_pipe_attr_init(&attr);\n    qurt_pipe_attr_set_buffer(&attr, pipe_buffer);\n    qurt_pipe_attr_set_buffer_partition(&attr, PIPE_ELEMENTS);\n    qurt_pipe_attr_set_elements(&attr, PIPE_ELEMENTS);\n    qurt_pipe_attr_set_element_size(&attr, ELEMENT_SIZE);\n\n    qurt_pipe_create(&sensor_pipe, &attr);\n}\n\n\/* Producer: send sensor data into the pipe *\/\nvoid sensor_reader_thread(void *arg)\n{\n    while (1) {\n        sensor_msg_t msg;\n        msg.sensor_id = 1;\n        msg.value = read_accelerometer();\n        msg.timestamp = qurt_sysclock_get_hw_ticks();\n\n        \/* Blocking send: waits if pipe is full *\/\n        qurt_pipe_send(&sensor_pipe, (char *)&msg, ELEMENT_SIZE);\n    }\n}\n\n\/* Consumer: receive sensor data from the pipe *\/\nvoid data_processor_thread(void *arg)\n{\n    sensor_msg_t msg;\n\n    while (1) {\n        \/* Blocking receive: waits if pipe is empty *\/\n        qurt_pipe_receive(&sensor_pipe, (char *)&msg, ELEMENT_SIZE);\n\n        printf(\"Sensor %d: value=%d at tick=%llun\",\n               msg.sensor_id, msg.value, msg.timestamp);\n\n        process_sensor_reading(&msg);\n    }\n}\n<\/qurt_pipe.h><\/qurt.h><\/code><\/pre>\n<p>\u0627\u06cc\u06a9 QRT \u067e\u0627\u0626\u067e \u062c\u0627\u0645\u062f \u0637\u0648\u0631 \u067e\u0631 \u0645\u062e\u062a\u0635 \u06a9\u0631\u062f\u06c1 \u0628\u0641\u0631\u060c \u0639\u0646\u0627\u0635\u0631 \u06a9\u06cc \u062a\u0639\u062f\u0627\u062f\u060c \u0627\u0648\u0631 \u0639\u0646\u0635\u0631 \u06a9\u06d2 \u0633\u0627\u0626\u0632 \u067e\u0631 \u0645\u0634\u062a\u0645\u0644 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u0633\u0679\u06cc\u06a9 \u06a9\u06cc \u0637\u0631\u062d\u060c \u0628\u0641\u0631 \u0645\u06cc\u0645\u0648\u0631\u06cc \u0628\u06be\u06cc \u0622\u067e \u06a9\u06cc \u0630\u0645\u06c1 \u062f\u0627\u0631\u06cc \u06c1\u06d2\u06d4 <code>qurt_pipe_send()<\/code> \u067e\u06cc\u063a\u0627\u0645\u0627\u062a \u06a9\u0648 \u067e\u0627\u0626\u067e \u0645\u06cc\u06ba \u06a9\u0627\u067e\u06cc \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u067e\u0627\u0626\u067e \u0628\u06be\u0631 \u062c\u0627\u0646\u06d2 \u067e\u0631 \u0628\u0644\u0627\u06a9 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 <code>qurt_pipe_receive()<\/code> \u067e\u06cc\u063a\u0627\u0645 \u06a9\u0648 \u06a9\u0627\u067e\u06cc \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u06af\u0631 \u067e\u0627\u0626\u067e \u062e\u0627\u0644\u06cc \u06c1\u06d2 \u062a\u0648 \u0628\u0644\u0627\u06a9 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u067e\u0627\u0626\u067e \u062a\u0645\u0627\u0645 \u0627\u0646\u062f\u0631\u0648\u0646\u06cc \u0645\u0637\u0627\u0628\u0642\u062a \u067e\u0630\u06cc\u0631\u06cc \u06a9\u0648 \u0633\u0646\u0628\u06be\u0627\u0644\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0644\u06c1\u0630\u0627 \u0639\u0644\u06cc\u062d\u062f\u06c1 mutex \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2.<\/p>\n<p>\u067e\u0627\u0626\u067e \u0642\u062f\u0631\u062a\u06cc \u0637\u0648\u0631 \u067e\u0631 \u06cc\u06c1\u0627\u06ba \u062f\u06a9\u06be\u0627\u0626\u06d2 \u06af\u0626\u06d2 \u0633\u06cc\u0646\u0633\u0631 \u0688\u06cc\u0679\u0627 \u067e\u06cc\u0679\u0631\u0646 \u0645\u06cc\u06ba \u0641\u0679 \u06c1\u0648\u062c\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0631\u06cc\u0688\u0631 \u062a\u06be\u0631\u06cc\u0688 \u0627\u06cc\u06a9 \u0645\u0642\u0631\u0631\u06c1 \u0634\u0631\u062d \u067e\u0631 \u06c1\u0627\u0631\u0688 \u0648\u06cc\u0626\u0631 \u06a9\u0627 \u0646\u0645\u0648\u0646\u06c1 \u0644\u06cc\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u067e\u06cc\u063a\u0627\u0645\u0627\u062a \u06a9\u0648 \u067e\u0627\u0626\u067e \u0645\u06cc\u06ba \u062f\u06be\u06a9\u06cc\u0644\u062a\u0627 \u06c1\u06d2\u060c \u062c\u0628\u06a9\u06c1 \u067e\u0631\u0648\u0633\u06cc\u0633\u0631 \u062a\u06be\u0631\u06cc\u0688 \u067e\u06cc\u063a\u0627\u0645\u0627\u062a \u06a9\u0648 \u0628\u0627\u06c1\u0631 \u0646\u06a9\u0627\u0644\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u0646 \u067e\u0631 \u06a9\u0627\u0631\u0631\u0648\u0627\u0626\u06cc \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u067e\u0627\u0626\u067e \u062e\u0648\u062f \u0628\u062e\u0648\u062f \u0628\u0641\u0631\u0646\u06af \u0627\u0648\u0631 \u0628\u06cc\u06a9 \u067e\u0631\u06cc\u0634\u0631 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-qurt-and-fastrpc\">\u06a9\u06cc\u0648 \u0622\u0631 \u0679\u06cc \u0627\u0648\u0631 \u0641\u0627\u0633\u0679 \u0622\u0631 \u067e\u06cc \u0633\u06cc<\/h2>\n<p>\u0627\u0635\u0644 Qualcomm \u0622\u0644\u0627\u062a \u0645\u06cc\u06ba\u060c QuRT \u0634\u0627\u0630 \u0648 \u0646\u0627\u062f\u0631 \u06c1\u06cc \u0627\u06a9\u06cc\u0644\u06d2 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u06d2 \u0622\u0631 \u0627\u06cc\u0645 \u0633\u06cc \u067e\u06cc \u06cc\u0648\u0632 \u067e\u0631 \u0627\u06cc\u0646\u0688\u0631\u0627\u0626\u06cc\u0688 \u06cc\u0627 \u0644\u06cc\u0646\u06a9\u0633 \u0627\u06cc\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646\u0632 \u0688\u06cc \u0627\u06cc\u0633 \u067e\u06cc \u06a9\u0648 \u06a9\u0645\u067e\u06cc\u0648\u0679\u06cc\u0634\u0646\u0644 \u0637\u0648\u0631 \u067e\u0631 \u0627\u0646\u062a\u06c1\u0627\u0626\u06cc \u06a9\u0627\u0645\u0648\u06ba \u06a9\u0648 \u0622\u0641 \u0644\u0648\u0688 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba: <strong>\u062a\u06cc\u0632 \u0622\u0631 \u067e\u06cc \u0633\u06cc<\/strong> (\u0641\u0627\u0633\u0679 \u0631\u06cc\u0645\u0648\u0679 \u0637\u0631\u06cc\u0642\u06c1 \u06a9\u0627\u0631 \u06a9\u0627\u0644). \u0645\u0646\u062f\u0631\u062c\u06c1 \u0630\u06cc\u0644 \u062e\u0627\u06a9\u06c1 \u067e\u0648\u0631\u06cc \u067e\u0627\u0626\u067e \u0644\u0627\u0626\u0646 \u06a9\u0648 \u062f\u06a9\u06be\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-plaintext\">\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502                         ARM CPU Side                          \u2502\n\u2502                                                               \u2502\n\u2502   your_app.c                                                  \u2502\n\u2502   \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510       \u2502\n\u2502   \u2502  #include \"my_dsp_module.h\"  \/\/ auto-generated    \u2502       \u2502\n\u2502   \u2502                                                   \u2502       \u2502\n\u2502   \u2502  \/\/ This looks like a normal function call,       \u2502       \u2502\n\u2502   \u2502  \/\/ but it actually executes on the DSP!          \u2502       \u2502\n\u2502   \u2502  result = my_dsp_module_process_audio(            \u2502       \u2502\n\u2502   \u2502      input_buffer, output_buffer, num_samples);   \u2502       \u2502\n\u2502   \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518       \u2502\n\u2502                       \u2502 FastRPC                               \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n            (crosses processor boundary)          \n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502                       \u25bc                                       \u2502\n\u2502                  DSP Side (QuRT)                              \u2502\n\u2502   my_dsp_module_skel.c  \/\/ auto-generated skeleton            \u2502\n\u2502   \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510       \u2502\n\u2502   \u2502  int my_dsp_module_process_audio(                 \u2502       \u2502\n\u2502   \u2502      const int16_t *input,                        \u2502       \u2502\n\u2502   \u2502      int16_t *output,                             \u2502       \u2502\n\u2502   \u2502      int num_samples)                             \u2502       \u2502\n\u2502   \u2502  {                                                \u2502       \u2502\n\u2502   \u2502      \/\/ This runs on the Hexagon DSP under QuRT   \u2502       \u2502\n\u2502   \u2502      apply_noise_reduction(input, output,         \u2502       \u2502\n\u2502   \u2502                             num_samples);         \u2502       \u2502\n\u2502   \u2502      return 0;                                    \u2502       \u2502\n\u2502   \u2502  }                                                \u2502       \u2502\n\u2502   \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518       \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u062e\u0627\u06a9\u06c1 FastRPC \u0641\u0646 \u062a\u0639\u0645\u06cc\u0631 \u06a9\u0648 \u0638\u0627\u06c1\u0631 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 ARM CPU \u06a9\u06cc \u0637\u0631\u0641\u060c \u0627\u06cc\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0627\u06cc\u0633\u06d2 \u0641\u0646\u06a9\u0634\u0646\u0632 \u06a9\u0648 \u06a9\u0627\u0644 \u06a9\u0631\u062a\u06cc \u06c1\u06d2 \u062c\u0648 \u06a9\u06c1 \u0631\u06cc\u06af\u0648\u0644\u0631 C \u0641\u0646\u06a9\u0634\u0646\u0632 \u06a9\u06cc \u0637\u0631\u062d \u0646\u0638\u0631 \u0622\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u0646\u062f\u0631\u0648\u0646\u06cc \u0637\u0648\u0631 \u067e\u0631\u060c FastRPC \u062f\u0644\u0627\u0626\u0644 \u06a9\u0648 \u0633\u06cc\u0631\u06cc\u0644\u0627\u0626\u0632 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0646\u06c1\u06cc\u06ba \u067e\u0631\u0648\u0633\u06cc\u0633\u0631 \u06a9\u06cc \u062d\u062f\u0648\u062f \u06a9\u06d2 \u067e\u0627\u0631 \u06c1\u06cc\u06a9\u0633\u0627\u06af\u0648\u0646 DSP \u06a9\u0648 \u0628\u06be\u06cc\u062c\u062a\u0627 \u06c1\u06d2\u060c QRT \u067e\u0631 \u0641\u0646\u06a9\u0634\u0646 \u06a9\u0648 \u0627\u0646\u062c\u0627\u0645 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0646\u062a\u0627\u0626\u062c \u0648\u0627\u067e\u0633 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u067e\u0631\u0648\u06af\u0631\u0627\u0645\u0631 \u06a9\u0627 \u062a\u062c\u0631\u0628\u06c1 \u0634\u0641\u0627\u0641 \u0631\u06cc\u0645\u0648\u0679 \u067e\u0631\u0648\u0633\u06cc\u062c\u0631 \u06a9\u0627\u0644\u0632 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-step-1-define-the-interface-idl-file\">\u0645\u0631\u062d\u0644\u06c1 1: \u0627\u0646\u0679\u0631\u0641\u06cc\u0633 \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u06a9\u0631\u06cc\u06ba (IDL \u0641\u0627\u0626\u0644)<\/h3>\n<p>\u0628\u0646\u0627\u0646\u0627 <code>.idl<\/code> \u0641\u0627\u0626\u0644 \u06a9\u06d2 \u0627\u0641\u0639\u0627\u0644 \u06a9\u0648 \u0628\u06cc\u0627\u0646 \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u06cc \u0641\u0627\u0626\u0644 \u062c\u0633\u06d2 ARM DSP \u0633\u06d2 \u06a9\u0627\u0644 \u06a9\u0631 \u0633\u06a9\u062a\u0627 \u06c1\u06d2:<\/p>\n<pre><code class=\"language-idl\">\/* my_dsp_module.idl *\/\n#include \"remote.idl\"\n#include \"AEEStdDef.idl\"\n\ninterface my_dsp_module {\n\n    \/* Simple computation *\/\n    long process_audio(\n        in sequence<short> input,\n        rout sequence<short> output,\n        in long num_samples\n    );\n\n    \/* Matrix multiply offload *\/\n    long matrix_multiply(\n        in sequence<float> mat_a,\n        in sequence<float> mat_b,\n        rout sequence<float> result,\n        in long rows_a,\n        in long cols_a,\n        in long cols_b\n    );\n};\n<\/float><\/float><\/float><\/short><\/short><\/code><\/pre>\n<p>\u0627\u0646\u0679\u0631\u0641\u06cc\u0633 \u0688\u06cc\u0641\u06cc\u0646\u06cc\u0634\u0646 \u0644\u06cc\u0646\u06af\u0648\u06cc\u062c (IDL) \u0641\u0627\u0626\u0644\u06cc\u06ba \u06a9\u0631\u0627\u0633 \u067e\u0631\u0648\u0633\u06cc\u0633\u0631 APIs \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u06a9\u0631\u062a\u06cc \u06c1\u06cc\u06ba\u06d4 \u06c1\u0631 \u0641\u0646\u06a9\u0634\u0646 \u0633\u0645\u062a \u06a9\u0648\u0627\u0644\u06cc\u0641\u0627\u0626\u0631 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u067e\u0646\u06d2 \u067e\u06cc\u0631\u0627\u0645\u06cc\u0679\u0631\u0632 \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 <code>in<\/code> \u0627\u06d2 \u0622\u0631 \u0627\u06cc\u0645 \u0633\u06d2 \u0688\u06cc \u0627\u06cc\u0633 \u067e\u06cc \u062a\u06a9 \u0628\u06c1\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0688\u06cc\u0679\u0627 \u06a9\u06d2 \u0644\u06cc\u06d2 <code>rout<\/code> \u0688\u06cc \u0627\u06cc\u0633 \u067e\u06cc \u0633\u06d2 \u0648\u0627\u067e\u0633 \u0627\u06d2 \u0622\u0631 \u0627\u06cc\u0645 \u0645\u06cc\u06ba \u0628\u06c1\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0688\u06cc\u0679\u0627 \u06a9\u06d2 \u0644\u06cc\u06d2\u06d4 \u06a9\u06c1 <code>sequence<type\/><\/code> \u0646\u062d\u0648 \u0627\u06cc\u06a9 \u0645\u062a\u063a\u06cc\u0631 \u0644\u0645\u0628\u0627\u0626\u06cc \u06a9\u06cc \u0635\u0641 \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 Hexagon SDK \u06a9\u0627 IDL \u06a9\u0645\u067e\u0627\u0626\u0644\u0631 \u0627\u0633 \u062a\u0639\u0631\u06cc\u0641 \u0633\u06d2 ARM \u0633\u0627\u0626\u06cc\u0688 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0633\u0679\u0628 \u06a9\u0648\u0688 \u0627\u0648\u0631 DSP \u0633\u0627\u0626\u06cc\u0688 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0633\u06a9\u06cc\u0644\u06cc\u0679\u0646 \u06a9\u0648\u0688 \u062a\u06cc\u0627\u0631 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-step-2-implement-the-dsp-side\">\u0645\u0631\u062d\u0644\u06c1 2: \u0688\u06cc \u0627\u06cc\u0633 \u067e\u06cc \u0633\u0627\u0626\u06cc\u0688 \u067e\u0631 \u0639\u0645\u0644 \u062f\u0631\u0622\u0645\u062f<\/h3>\n<pre><code class=\"language-c\">\/* my_dsp_module_imp.c - DSP implementation *\/\n\n#include \"my_dsp_module.h\"\n#include <qurt.h>\n#include <stdio.h>\n\nint my_dsp_module_process_audio(\n    const int16_t *input, int input_len,\n    int16_t *output, int output_len,\n    int num_samples)\n{\n    if (!input || !output || num_samples <= 0) {\n        return -1;\n    }\n\n    \/* Invalidate cache: ARM wrote this data *\/\n    qurt_mem_cache_clean((void *)input,\n                          num_samples * sizeof(int16_t),\n                          QURT_MEM_CACHE_INVALIDATE);\n\n    \/* Process on the DSP *\/\n    for (int i = 0; i < num_samples; i++) {\n        \/* Simple noise gate *\/\n        if (abs(input[i]) < 100) {\n            output[i] = 0;\n        } else {\n            output[i] = input[i];\n        }\n    }\n\n    \/* Flush cache: ARM will read this data *\/\n    qurt_mem_cache_clean(output,\n                          num_samples * sizeof(int16_t),\n                          QURT_MEM_CACHE_FLUSH);\n\n    return 0;\n}\n<\/stdio.h><\/qurt.h><\/code><\/pre>\n<p>DSP \u06a9\u06d2 \u0646\u0641\u0627\u0630 \u06a9\u0648 ARM CPU \u06a9\u06d2 \u0644\u06a9\u06be\u06d2 \u06c1\u0648\u0626\u06d2 \u0627\u0646 \u067e\u0679 \u0628\u0641\u0631\u0632 \u0645\u0648\u0635\u0648\u0644 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u067e\u0691\u06be\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2\u060c \u06a9\u0648\u0688 \u06a9\u06cc\u0634\u06d2 \u06a9\u0648 \u0628\u0627\u0637\u0644 \u06a9\u0631 \u062f\u06cc\u062a\u0627 \u06c1\u06d2 \u0644\u06c1\u0630\u0627 \u0688\u06cc \u0627\u06cc\u0633 \u067e\u06cc \u0628\u0627\u0633\u06cc \u06a9\u06cc\u0634 \u0627\u0646\u062f\u0631\u0627\u062c\u0627\u062a \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u0645\u06cc\u0646 \u0645\u06cc\u0645\u0648\u0631\u06cc \u0645\u06cc\u06ba \u062a\u0627\u0632\u06c1 \u062a\u0631\u06cc\u0646 \u0688\u06cc\u0679\u0627 \u062f\u06cc\u06a9\u06be\u062a\u0627 \u06c1\u06d2\u06d4 \u0622\u0624\u0679 \u067e\u0679 \u0644\u06a9\u06be\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f\u060c \u06a9\u0648\u0688 \u06a9\u06cc\u0634\u06d2 \u06a9\u0648 \u0641\u0644\u0634 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062a\u0627\u06a9\u06c1 ARM CPU DSP \u0633\u06d2 \u0646\u062a\u0627\u0626\u062c \u062f\u06cc\u06a9\u06be \u0633\u06a9\u06d2\u06d4 \u0627\u0635\u0644 \u067e\u0631\u0648\u0633\u06cc\u0633\u0646\u06af (\u0627\u0633 \u0645\u062b\u0627\u0644 \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u0633\u0627\u062f\u06c1 \u0634\u0648\u0631 \u06af\u06cc\u0679) \u06a9\u06cc\u0634 \u0622\u067e\u0631\u06cc\u0634\u0646\u0632 \u06a9\u06d2 \u062f\u0631\u0645\u06cc\u0627\u0646 \u0686\u0644\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-step-3-implement-the-arm-side\">\u0645\u0631\u062d\u0644\u06c1 3: \u0627\u06d2 \u0622\u0631 \u0627\u06cc\u0645 \u0633\u0627\u0626\u06cc\u0688 \u06a9\u0627 \u0646\u0641\u0627\u0630<\/h3>\n<pre><code class=\"language-c\">\/* main_arm.c - ARM\/Android application *\/\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <rpcmem.h>\n#include \"my_dsp_module.h\"\n\nint main(void)\n{\n    int num_samples = 1024;\n\n    \/* Use ION memory for zero-copy sharing with DSP *\/\n    rpcmem_init();\n\n    int16_t *input = (int16_t *)rpcmem_alloc(\n        RPCMEM_HEAP_ID_SYSTEM,\n        RPCMEM_DEFAULT_FLAGS,\n        num_samples * sizeof(int16_t));\n\n    int16_t *output = (int16_t *)rpcmem_alloc(\n        RPCMEM_HEAP_ID_SYSTEM,\n        RPCMEM_DEFAULT_FLAGS,\n        num_samples * sizeof(int16_t));\n\n    if (!input || !output) {\n        printf(\"rpcmem_alloc failed!n\");\n        return -1;\n    }\n\n    \/* Fill input with audio data *\/\n    for (int i = 0; i < num_samples; i++) {\n        input[i] = (int16_t)(i % 256);\n    }\n\n    \/* This call goes to the DSP via FastRPC *\/\n    int result = my_dsp_module_process_audio(\n        input, num_samples,\n        output, num_samples,\n        num_samples);\n\n    if (result != 0) {\n        printf(\"DSP processing failed: %dn\", result);\n    } else {\n        printf(\"DSP processing succeeded!n\");\n        printf(\"First 10 output samples: \");\n        for (int i = 0; i < 10; i++) {\n            printf(\"%d \", output[i]);\n        }\n        printf(\"n\");\n    }\n\n    rpcmem_free(input);\n    rpcmem_free(output);\n    rpcmem_deinit();\n\n    return 0;\n}\n<\/rpcmem.h><\/stdlib.h><\/stdio.h><\/code><\/pre>\n<p>ARM \u0633\u0627\u0626\u06cc\u0688 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2: <code>rpcmem_alloc()<\/code> ARM CPU \u0627\u0648\u0631 Hexagon DSP \u062f\u0648\u0646\u0648\u06ba ION \u0645\u06cc\u0645\u0648\u0631\u06cc \u06a9\u0648 \u0645\u062e\u062a\u0635 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0627\u06cc\u06a9 \u0645\u0634\u062a\u0631\u06a9\u06c1 \u0645\u06cc\u0645\u0648\u0631\u06cc \u0627\u06cc\u0631\u06cc\u0627 \u062c\u0633 \u062a\u06a9 \u0628\u063a\u06cc\u0631 \u06a9\u0627\u067e\u06cc \u06a9\u06cc\u06d2 \u0631\u0633\u0627\u0626\u06cc \u062d\u0627\u0635\u0644 \u06a9\u06cc \u062c\u0627 \u0633\u06a9\u062a\u06cc \u06c1\u06d2\u06d4 \u06a9\u0627\u0644 \u06a9\u0631\u06cc\u06ba <code>my_dsp_module_process_audio()<\/code> \u0627\u06af\u0631\u0686\u06c1 \u06cc\u06c1 \u0627\u06cc\u06a9 \u0639\u0627\u0645 \u0641\u0646\u06a9\u0634\u0646 \u06a9\u0627\u0644 \u06a9\u06cc \u0637\u0631\u062d \u0644\u06af\u062a\u0627 \u06c1\u06d2\u060c \u0641\u0627\u0633\u0679 \u0622\u0631 \u067e\u06cc \u0633\u06cc \u0627\u0633\u06d2 \u0634\u0641\u0627\u0641 \u0637\u0631\u06cc\u0642\u06d2 \u0633\u06d2 \u0688\u06cc \u0627\u06cc\u0633 \u067e\u06cc \u062a\u06a9 \u067e\u06c1\u0646\u0686\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u062c\u0628 \u06a9\u0627\u0644 \u0648\u0627\u067e\u0633 \u0622\u062a\u06cc \u06c1\u06d2\u060c \u0622\u0624\u0679 \u067e\u0679 \u0628\u0641\u0631 \u0645\u06cc\u06ba DSP \u06a9\u06d2 \u0646\u062a\u0627\u0626\u062c \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-building-the-complete-project\">\u0627\u06cc\u06a9 \u0645\u06a9\u0645\u0644 \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u06a9\u06cc \u062a\u0639\u0645\u06cc\u0631<\/h3>\n<p>FastRPC \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062f\u0648 SCons \u06a9\u06cc \u062a\u0639\u0645\u06cc\u0631 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u06d4 \u0627\u06cc\u06a9 ARM CPU \u0633\u0627\u0626\u06cc\u0688 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06c1\u06d2 \u0627\u0648\u0631 \u062f\u0648\u0633\u0631\u0627 Hexagon DSP \u0633\u0627\u0626\u06cc\u0688 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06c1\u06d2\u06d4 \u06c1\u0631 \u067e\u06c1\u0644\u0648 \u06a9\u0627 \u0627\u067e\u0646\u0627 \u0645\u0648\u0627\u062f \u06c1\u06d2\u06d4 <code>.min<\/code> \u0641\u0627\u0626\u0644(<code>android.min<\/code> \u0627\u0648\u0631 <code>hexagon.min<\/code>)\u060c \u062f\u0648\u0646\u0648\u06ba \u06a9\u0648 SDK \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u06c1\u06cc\u0646\u0688\u0644 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 <code>SConstruct<\/code>.<\/p>\n<pre><code class=\"language-bash\">cd $HEXAGON_SDK_ROOT\n\n# Build for ARM target (Android) via make wrapper\nmake V=android_Release tree=my_dsp_module\n\n# Build for Hexagon DSP via make wrapper\nmake V=hexagon_Release_dynamic_toolv84_v66 tree=my_dsp_module\n\n# Or invoke SCons directly for both variants\npython tools\/build\/scons\/scons.py \n    V=android_Release \n    V=hexagon_Release_dynamic_toolv84_v66 \n    my_dsp_module\n\n# Push to device\nadb push android_Release\/ship\/my_dsp_module \/data\/local\/tmp\/\nadb push hexagon_Release_dynamic_toolv84_v66\/ship\/libmy_dsp_module_skel.so \n    \/data\/local\/tmp\/\n\n# Run it\nadb shell \"cd \/data\/local\/tmp && .\/my_dsp_module\"\n<\/code><\/pre>\n<p>\u062a\u0639\u0645\u06cc\u0631 \u062f\u0648 \u0622\u0624\u0679 \u067e\u0679 \u062a\u06cc\u0627\u0631 \u06a9\u0631\u062a\u06cc \u06c1\u06d2: ARM \u0642\u0627\u0628\u0644 \u0639\u0645\u0644 (\u0627\u06cc\u06a9 \u0627\u0633\u0679\u0628 \u0633\u06d2 \u0645\u0631\u062a\u0628 \u06a9\u06cc\u0627 \u06af\u06cc\u0627) \u0627\u0648\u0631 <code>main_arm.c<\/code>) \u0627\u0648\u0631 \u0645\u0633\u062f\u0633 \u0645\u0634\u062a\u0631\u06a9\u06c1 \u0644\u0627\u0626\u0628\u0631\u06cc\u0631\u06cc\u0627\u06ba ( <code>_skel.so<\/code> \u0688\u06cc \u0627\u06cc\u0633 \u067e\u06cc \u06a9\u06d2 \u0646\u0641\u0627\u0630 \u0633\u06d2 \u0645\u0631\u062a\u0628 \u06a9\u0631\u062f\u06c1 \u0641\u0627\u0626\u0644\u06cc\u06ba)\u06d4 SCons \u062e\u0648\u062f \u0628\u062e\u0648\u062f IDL \u062a\u0627\u0644\u06cc\u0641 \u06a9\u06d2 \u0645\u0631\u062d\u0644\u06d2 \u06a9\u0648 \u06c1\u06cc\u0646\u0688\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 <code>.idl<\/code> \u0633\u0679\u0628 \u0627\u0648\u0631 \u0633\u06a9\u06cc\u0644\u06cc\u0679\u0646 \u0633\u06cc \u0633\u0648\u0631\u0633 \u0641\u0627\u0626\u0644\u06cc\u06ba \u0628\u0646\u0627\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0641\u0627\u0626\u0644\u06cc\u06ba \u0628\u0646\u0627\u0626\u06cc\u06ba \u0627\u0648\u0631 \u0627\u0646\u06c1\u06cc\u06ba \u0645\u0646\u0627\u0633\u0628 \u0648\u06cc\u0631\u06cc\u0646\u0679 \u0628\u0644\u0688 \u0645\u06cc\u06ba \u0634\u0627\u0645\u0644 \u06a9\u0631\u06cc\u06ba\u06d4 \u062f\u0648\u0646\u0648\u06ba \u0622\u0624\u0679 \u067e\u0679 \u06a9\u0648 \u0688\u06cc\u0648\u0627\u0626\u0633 \u067e\u0631 \u062f\u06be\u06a9\u06cc\u0644 \u062f\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u062c\u0628 ARM \u0627\u06cc\u06af\u0632\u06cc\u06a9\u06cc\u0648\u0679\u06cc\u0628\u0644 \u0686\u0644\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 FastRPC \u0641\u0646\u06a9\u0634\u0646 \u06a9\u0648 \u06a9\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u0633\u0633\u0679\u0645 \u0627\u0633\u06a9\u06cc\u0644\u06cc\u0679\u0646 \u0644\u0627\u0626\u0628\u0631\u06cc\u0631\u06cc \u06a9\u0648 DSP \u0645\u06cc\u06ba \u0644\u0648\u0688 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u06a9\u0627\u0644 \u06a9\u0648 \u0631\u0648\u0679 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-building-a-sensor-fusion-pipeline\">\u0633\u06cc\u0646\u0633\u0631 \u0641\u06cc\u0648\u0698\u0646 \u067e\u0627\u0626\u067e \u0644\u0627\u0626\u0646 \u06a9\u06cc \u062a\u0639\u0645\u06cc\u0631<\/h2>\n<p>\u0627\u0633 \u0633\u06cc\u06a9\u0634\u0646 \u0645\u06cc\u06ba\u060c \u06c1\u0645 \u062a\u06be\u0631\u06cc\u0688\u0632\u060c \u0633\u0646\u06a9\u0631\u0648\u0646\u0627\u0626\u0632\u06cc\u0634\u0646\u060c \u0679\u0627\u0626\u0645\u0631\u0632\u060c \u0627\u0648\u0631 \u0633\u06af\u0646\u0644\u0632 \u06a9\u0648 \u0627\u06cc\u06a9 \u0645\u06a9\u0645\u0644\u060c \u062d\u0642\u06cc\u0642\u062a \u067e\u0633\u0646\u062f\u0627\u0646\u06c1 QRT \u0627\u06cc\u067e\u0644\u06cc \u06a9\u06cc\u0634\u0646 \u0645\u06cc\u06ba \u0636\u0645 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u067e\u0627\u0626\u067e \u0644\u0627\u0626\u0646 \u062a\u06cc\u0646 \u0645\u0635\u0646\u0648\u0639\u06cc \u0633\u06cc\u0646\u0633\u0631\u0632 (\u0627\u06cc\u06a9\u0633\u0644\u0631\u0648\u0645\u06cc\u0679\u0631\u060c \u06af\u0627\u0626\u0631\u0648\u0633\u06a9\u0648\u067e\u060c \u0627\u0648\u0631 \u0645\u06cc\u06af\u0646\u06cc\u0679\u0648\u0645\u06cc\u0679\u0631) \u0633\u06d2 \u067e\u0691\u06be\u062a\u06cc \u06c1\u06d2\u060c \u062a\u06a9\u0645\u06cc\u0644\u06cc \u0641\u0644\u0679\u0631\u0632 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u0688\u06cc\u0679\u0627 \u06a9\u0648 \u0641\u06cc\u0648\u0632 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u060c \u0627\u0648\u0631 100 \u06c1\u0631\u0679\u062c \u067e\u0631 \u0648\u0627\u0642\u0641\u06cc\u062a \u06a9\u06cc \u0627\u0637\u0644\u0627\u0639 \u062f\u06cc\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-c\">\/*\n * sensor_fusion.c - Multi-sensor fusion pipeline on QuRT\n *\n * Architecture:\n *   [Accel ISR] \u2500\u2500\u25ba [Fusion Thread] \u2500\u2500\u25ba [Report Thread]\n *   [Gyro ISR]  \u2500\u2500\u25ba       \u25b2\n *   [Mag ISR]   \u2500\u2500\u25ba       \u2502\n *                    [Timer Thread]\n *                    (triggers fusion every 10ms)\n *\/\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <qurt.h>\n#include <qurt_timer.h>\n\n\/* Configuration *\/\n#define STACK_SIZE          8192\n#define FUSION_PERIOD_US    10000   \/* 10ms = 100Hz fusion rate *\/\n#define QUEUE_DEPTH         32\n\n\/* Data types *\/\ntypedef struct {\n    float x, y, z;\n    unsigned long long timestamp;\n} vec3_sample_t;\n\ntypedef struct {\n    vec3_sample_t accel;\n    vec3_sample_t gyro;\n    vec3_sample_t mag;\n    float roll, pitch, yaw;\n} fused_state_t;\n\n\/* Thread stacks *\/\nstatic char accel_stack[STACK_SIZE]  __attribute__((aligned(8)));\nstatic char gyro_stack[STACK_SIZE]   __attribute__((aligned(8)));\nstatic char mag_stack[STACK_SIZE]    __attribute__((aligned(8)));\nstatic char fusion_stack[STACK_SIZE] __attribute__((aligned(8)));\nstatic char report_stack[STACK_SIZE] __attribute__((aligned(8)));\n\n\/* Shared state *\/\nstatic vec3_sample_t latest_accel;\nstatic vec3_sample_t latest_gyro;\nstatic vec3_sample_t latest_mag;\nstatic fused_state_t latest_fused;\n\nstatic qurt_mutex_t sensor_mutex;\nstatic qurt_mutex_t fused_mutex;\nstatic qurt_signal_t fusion_signal;\nstatic qurt_signal_t report_signal;\n\n#define SIG_FUSION_TICK    0x01\n#define SIG_NEW_FUSED_DATA 0x01\n#define SIG_SHUTDOWN       0x80\n\nstatic volatile int running = 1;\n\n\/* Simulated sensor reads *\/\nstatic void read_accelerometer(vec3_sample_t *sample)\n{\n    sample->x = 0.01f;\n    sample->y = 0.02f;\n    sample->z = 9.81f;\n    sample->timestamp = qurt_sysclock_get_hw_ticks();\n}\n\nstatic void read_gyroscope(vec3_sample_t *sample)\n{\n    sample->x = 0.001f;\n    sample->y = -0.002f;\n    sample->z = 0.0005f;\n    sample->timestamp = qurt_sysclock_get_hw_ticks();\n}\n\nstatic void read_magnetometer(vec3_sample_t *sample)\n{\n    sample->x = 25.0f;\n    sample->y = -5.0f;\n    sample->z = 40.0f;\n    sample->timestamp = qurt_sysclock_get_hw_ticks();\n}\n\n\/* Accelerometer thread *\/\nvoid accel_thread(void *arg)\n{\n    printf(\"[Accel] Thread startedn\");\n\n    while (running) {\n        vec3_sample_t sample;\n        read_accelerometer(&sample);\n\n        qurt_mutex_lock(&sensor_mutex);\n        latest_accel = sample;\n        qurt_mutex_unlock(&sensor_mutex);\n\n        \/* ~400Hz sample rate *\/\n        qurt_timer_sleep(2500);\n    }\n\n    printf(\"[Accel] Thread exitingn\");\n    qurt_thread_exit(QURT_EOK);\n}\n\n\/* Gyroscope thread *\/\nvoid gyro_thread(void *arg)\n{\n    printf(\"[Gyro] Thread startedn\");\n\n    while (running) {\n        vec3_sample_t sample;\n        read_gyroscope(&sample);\n\n        qurt_mutex_lock(&sensor_mutex);\n        latest_gyro = sample;\n        qurt_mutex_unlock(&sensor_mutex);\n\n        \/* 1kHz sample rate *\/\n        qurt_timer_sleep(1000);\n    }\n\n    printf(\"[Gyro] Thread exitingn\");\n    qurt_thread_exit(QURT_EOK);\n}\n\n\/* Magnetometer thread *\/\nvoid mag_thread(void *arg)\n{\n    printf(\"[Mag] Thread startedn\");\n\n    while (running) {\n        vec3_sample_t sample;\n        read_magnetometer(&sample);\n\n        qurt_mutex_lock(&sensor_mutex);\n        latest_mag = sample;\n        qurt_mutex_unlock(&sensor_mutex);\n\n        \/* 100Hz sample rate *\/\n        qurt_timer_sleep(10000);\n    }\n\n    printf(\"[Mag] Thread exitingn\");\n    qurt_thread_exit(QURT_EOK);\n}\n\n\/* Simplified complementary filter *\/\nstatic void compute_orientation(\n    const vec3_sample_t *accel,\n    const vec3_sample_t *gyro,\n    const vec3_sample_t *mag,\n    fused_state_t *state)\n{\n    float dt = 0.01f;\n\n    float accel_roll = atan2f(accel->y, accel->z) * 57.2958f;\n    float accel_pitch = atan2f(-accel->x,\n        sqrtf(accel->y * accel->y + accel->z * accel->z)) * 57.2958f;\n\n    \/* Trust gyro short-term, accel long-term *\/\n    state->roll = 0.98f * (state->roll + gyro->x * dt * 57.2958f)\n                + 0.02f * accel_roll;\n    state->pitch = 0.98f * (state->pitch + gyro->y * dt * 57.2958f)\n                 + 0.02f * accel_pitch;\n\n    state->yaw = atan2f(mag->y, mag->x) * 57.2958f;\n\n    state->accel = *accel;\n    state->gyro = *gyro;\n    state->mag = *mag;\n}\n\n\/* Fusion thread (runs every 10ms) *\/\nvoid fusion_thread(void *arg)\n{\n    qurt_timer_t fusion_timer;\n    qurt_timer_attr_t timer_attr;\n\n    printf(\"[Fusion] Thread startedn\");\n\n    qurt_timer_attr_init(&timer_attr);\n    qurt_timer_attr_set_duration(&timer_attr,\n        qurt_timer_convert_time_to_ticks(FUSION_PERIOD_US,\n                                          QURT_TIME_USEC));\n    qurt_timer_attr_set_signal(&timer_attr, &fusion_signal);\n    qurt_timer_attr_set_signal_mask(&timer_attr, SIG_FUSION_TICK);\n    qurt_timer_attr_set_type(&timer_attr, QURT_TIMER_PERIODIC);\n\n    qurt_timer_create(&fusion_timer, &timer_attr);\n\n    while (running) {\n        unsigned int sigs = qurt_signal_wait(\n            &fusion_signal,\n            SIG_FUSION_TICK | SIG_SHUTDOWN,\n            QURT_SIGNAL_ATTR_WAIT_ANY);\n\n        if (sigs & SIG_SHUTDOWN) break;\n\n        qurt_signal_clear(&fusion_signal, SIG_FUSION_TICK);\n\n        \/* Snapshot sensor data under lock *\/\n        vec3_sample_t a, g, m;\n        qurt_mutex_lock(&sensor_mutex);\n        a = latest_accel;\n        g = latest_gyro;\n        m = latest_mag;\n        qurt_mutex_unlock(&sensor_mutex);\n\n        \/* Run the fusion algorithm (no lock needed, local data) *\/\n        fused_state_t state;\n        qurt_mutex_lock(&fused_mutex);\n        state = latest_fused;\n        qurt_mutex_unlock(&fused_mutex);\n\n        compute_orientation(&a, &g, &m, &state);\n\n        \/* Publish fused result *\/\n        qurt_mutex_lock(&fused_mutex);\n        latest_fused = state;\n        qurt_mutex_unlock(&fused_mutex);\n\n        \/* Notify reporter *\/\n        qurt_signal_set(&report_signal, SIG_NEW_FUSED_DATA);\n    }\n\n    qurt_timer_delete(fusion_timer);\n    printf(\"[Fusion] Thread exitingn\");\n    qurt_thread_exit(QURT_EOK);\n}\n\n\/* Reporting thread *\/\nvoid report_thread(void *arg)\n{\n    int report_count = 0;\n\n    printf(\"[Report] Thread startedn\");\n\n    while (running) {\n        unsigned int sigs = qurt_signal_wait(\n            &report_signal,\n            SIG_NEW_FUSED_DATA | SIG_SHUTDOWN,\n            QURT_SIGNAL_ATTR_WAIT_ANY);\n\n        if (sigs & SIG_SHUTDOWN) break;\n\n        qurt_signal_clear(&report_signal, SIG_NEW_FUSED_DATA);\n\n        fused_state_t state;\n        qurt_mutex_lock(&fused_mutex);\n        state = latest_fused;\n        qurt_mutex_unlock(&fused_mutex);\n\n        \/* Report every 100th update (once per second at 100Hz) *\/\n        if (++report_count % 100 == 0) {\n            printf(\"[Report] Orientation - Roll: %.2f  Pitch: %.2f  \"\n                   \"Yaw: %.2f  (update #%d)n\",\n                   state.roll, state.pitch, state.yaw, report_count);\n        }\n    }\n\n    printf(\"[Report] Thread exitingn\");\n    qurt_thread_exit(QURT_EOK);\n}\n\n\/* Main *\/\nint main(void)\n{\n    qurt_thread_t threads[5];\n    qurt_thread_attr_t attr;\n    int status;\n\n    printf(\"=== Sensor Fusion Pipeline Starting ===n\");\n\n    \/* Initialize synchronization primitives *\/\n    qurt_mutex_init(&sensor_mutex);\n    qurt_mutex_init(&fused_mutex);\n    qurt_signal_init(&fusion_signal);\n    qurt_signal_init(&report_signal);\n    memset(&latest_fused, 0, sizeof(latest_fused));\n\n    struct {\n        const char *name;\n        char *stack;\n        int priority;\n        void (*func)(void *);\n    } thread_configs[] = {\n        {\"accel_reader\", accel_stack,  60, accel_thread},\n        {\"gyro_reader\",  gyro_stack,   60, gyro_thread},\n        {\"mag_reader\",   mag_stack,    70, mag_thread},\n        {\"fusion\",       fusion_stack, 80, fusion_thread},\n        {\"reporter\",     report_stack, 120, report_thread},\n    };\n\n    \/* Create all threads *\/\n    for (int i = 0; i < 5; i++) {\n        qurt_thread_attr_init(&#038;attr);\n        qurt_thread_attr_set_name(&#038;attr, thread_configs[i].name);\n        qurt_thread_attr_set_stack_addr(&#038;attr, thread_configs[i].stack);\n        qurt_thread_attr_set_stack_size(&#038;attr, STACK_SIZE);\n        qurt_thread_attr_set_priority(&#038;attr, thread_configs[i].priority);\n\n        int result = qurt_thread_create(&#038;threads[i], &#038;attr,\n                                         thread_configs[i].func, NULL);\n        if (result != QURT_EOK) {\n            printf(\"Failed to create thread '%s': %dn\",\n                   thread_configs[i].name, result);\n            return -1;\n        }\n        printf(\"Created thread '%s' (priority %d)n\",\n               thread_configs[i].name, thread_configs[i].priority);\n    }\n\n    \/* Let it run for 10 seconds *\/\n    printf(\"Pipeline running for 10 seconds...n\");\n    qurt_timer_sleep(10000000);\n\n    \/* Shutdown *\/\n    printf(\"Shutting down...n\");\n    running = 0;\n    qurt_signal_set(&#038;fusion_signal, SIG_SHUTDOWN);\n    qurt_signal_set(&#038;report_signal, SIG_SHUTDOWN);\n\n    \/* Wait for all threads to finish *\/\n    for (int i = 0; i < 5; i++) {\n        qurt_thread_join(threads[i], &#038;status);\n    }\n\n    \/* Clean up *\/\n    qurt_mutex_destroy(&#038;sensor_mutex);\n    qurt_mutex_destroy(&#038;fused_mutex);\n    qurt_signal_destroy(&#038;fusion_signal);\n    qurt_signal_destroy(&#038;report_signal);\n\n    printf(\"=== Sensor Fusion Pipeline Complete ===n\");\n    return 0;\n}\n<\/qurt_timer.h><\/qurt.h><\/string.h><\/stdlib.h><\/stdio.h><\/code><\/pre>\n<p>\u06cc\u06c1 \u067e\u0627\u0626\u067e \u0644\u0627\u0626\u0646 \u0627\u06cc\u06a9 \u0633\u0627\u062a\u06be \u06a9\u0627\u0645 \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u06a9\u0626\u06cc QRT \u0646\u0645\u0648\u0646\u0648\u06ba \u06a9\u0648 \u0638\u0627\u06c1\u0631 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u062a\u06cc\u0646 \u0633\u06cc\u0646\u0633\u0631 \u0631\u06cc\u0688\u0631 \u062a\u06be\u0631\u06cc\u0688\u0632 \u0633\u0628 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u062a\u0631\u062c\u06cc\u062d \u067e\u0631 \u0686\u0644\u062a\u06d2 \u06c1\u06cc\u06ba (\u0627\u06cc\u06a9\u0633\u0644\u0631\u06cc\u0634\u0646 \u0627\u0648\u0631 \u06af\u0627\u0626\u0631\u0648 \u06a9\u06d2 \u0644\u06cc\u06d2 60\u060c \u0633\u0633\u062a \u0645\u06cc\u06af\u0646\u06cc\u0679\u0648\u0645\u06cc\u0679\u0631 \u06a9\u06d2 \u0644\u06cc\u06d2 70) \u0627\u0648\u0631 \u0645\u0633\u0644\u0633\u0644 \u062a\u0627\u0632\u06c1 \u062a\u0631\u06cc\u0646 \u0646\u0645\u0648\u0646\u06d2 \u0627\u06cc\u06a9 mutex \u06a9\u06d2 \u062a\u062d\u062a \u0645\u0634\u062a\u0631\u06a9\u06c1 \u062d\u0627\u0644\u062a \u0645\u06cc\u06ba \u0644\u06a9\u06be\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0641\u06cc\u0648\u0698\u0646 \u062a\u06be\u0631\u06cc\u0688\u060c \u06c1\u0631 10 \u0627\u06cc\u0645 \u0627\u06cc\u0633 \u067e\u0631 \u0627\u06cc\u06a9 \u0645\u062a\u0648\u0627\u062a\u0631 \u0679\u0627\u0626\u0645\u0631 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0645\u062a\u062d\u0631\u06a9 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u060c \u062a\u06cc\u0646\u0648\u06ba \u0633\u06cc\u0646\u0633\u0631 \u0631\u06cc\u0688\u0646\u06af\u0632 \u06a9\u0648 \u0633\u0646\u06cc\u067e \u0634\u0627\u0679 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0631\u0648\u0644\u060c \u067e\u0686 \u0627\u0648\u0631 \u06cc\u0627\u0624 \u06a9\u0627 \u062d\u0633\u0627\u0628 \u0644\u06af\u0627\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062a\u06a9\u0645\u06cc\u0644\u06cc \u0641\u0644\u0679\u0631\u0632 \u0686\u0644\u0627\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0641\u06cc\u0648\u0698\u0646 \u06a9\u06d2 \u0646\u062a\u0627\u0626\u062c \u0634\u0627\u0626\u0639 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u062c\u0628 \u0628\u06be\u06cc \u0646\u06cc\u0627 \u0641\u06cc\u0648\u0632\u0688 \u0688\u06cc\u0679\u0627 \u062f\u0633\u062a\u06cc\u0627\u0628 \u06c1\u0648\u062a\u0627 \u06c1\u06d2 \u062a\u0648 \u0633\u0628 \u0633\u06d2 \u06a9\u0645 \u062a\u0631\u062c\u06cc\u062d (120) \u0631\u067e\u0648\u0631\u0679\u0646\u06af \u062a\u06be\u0631\u06cc\u0688 \u0627\u06cc\u06a9 \u0633\u06af\u0646\u0644 \u0648\u0635\u0648\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0641\u06cc \u0633\u06cc\u06a9\u0646\u0688 \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u0628\u0627\u0631 \u0633\u0645\u062a \u06a9\u0648 \u0631\u06cc\u06a9\u0627\u0631\u0688 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-priority-assignment\">\u062a\u0631\u062c\u06cc\u062d\u06cc \u062a\u0641\u0648\u06cc\u0636<\/h3>\n<pre><code class=\"language-plaintext\">Priority 60:  Sensor readers (highest priority, never miss hardware data)\nPriority 80:  Fusion engine (runs every 10ms, must finish quickly)\nPriority 120: Reporter (lowest priority, only logging)\n<\/code><\/pre>\n<p>\u062a\u0631\u062c\u06cc\u062d\u06cc \u062a\u0641\u0648\u06cc\u0636 \u0633\u062e\u062a \u0642\u0648\u0627\u0646\u06cc\u0646 \u06a9\u06cc \u067e\u06cc\u0631\u0648\u06cc \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u0639\u0646\u06cc \u06c1\u0627\u0631\u0688 \u0648\u06cc\u0626\u0631 \u06a9\u06d2 \u0642\u0631\u06cc\u0628 \u062a\u06be\u0631\u06cc\u0688\u0632 \u06a9\u0648 \u0632\u06cc\u0627\u062f\u06c1 \u062a\u0631\u062c\u06cc\u062d \u062d\u0627\u0635\u0644 \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4 \u0627\u06af\u0631 \u0641\u06cc\u0648\u0698\u0646 \u062a\u06be\u0631\u06cc\u0688 \u0645\u06cc\u06ba \u0628\u06c1\u062a \u0632\u06cc\u0627\u062f\u06c1 \u0648\u0642\u062a \u0644\u06af\u062a\u0627 \u06c1\u06d2 \u062a\u0648 \u0631\u067e\u0648\u0631\u0679\u0631 \u0627\u0646\u062a\u0638\u0627\u0631 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u062a\u0627\u062e\u06cc\u0631 \u0648\u0627\u0644\u06d2 \u0644\u0627\u06af \u067e\u06cc\u063a\u0627\u0645\u0627\u062a \u0642\u0627\u0628\u0644 \u0642\u0628\u0648\u0644 \u06c1\u06cc\u06ba \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u0627\u0646 \u06a9\u06d2 \u062d\u0642\u06cc\u0642\u06cc \u0648\u0642\u062a \u06a9\u06d2 \u0646\u062a\u0627\u0626\u062c \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u06af\u0631 \u0633\u06cc\u0646\u0633\u0631 \u0631\u06cc\u0688\u0646\u06af \u0645\u06cc\u06ba \u062a\u0627\u062e\u06cc\u0631 \u06c1\u0648\u062a\u06cc \u06c1\u06d2 \u062a\u0648\u060c \u0641\u06cc\u0648\u0698\u0646 \u0627\u0644\u06af\u0648\u0631\u062a\u06be\u0645 \u0628\u0627\u0633\u06cc \u0688\u06cc\u0679\u0627 \u067e\u0631 \u06a9\u0627\u0645 \u06a9\u0631\u06d2 \u06af\u0627\u06d4<\/p>\n<p>\u0688\u0631\u0648\u0646\u0632 \u06cc\u0627 \u0631\u0648\u0628\u0648\u0679\u0633 \u06a9\u0648 \u06a9\u0646\u0679\u0631\u0648\u0644 \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u06cc \u062d\u0642\u06cc\u0642\u06cc \u062f\u0646\u06cc\u0627 \u06a9\u06cc \u0627\u06cc\u067e\u0644\u06cc \u06a9\u06cc\u0634\u0646\u0632 \u0645\u06cc\u06ba\u060c \u067e\u0631\u0627\u0646\u06d2 IMU \u0688\u06cc\u0679\u0627 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 \u0633\u0645\u062a \u06a9\u06d2 \u063a\u0644\u0637 \u062a\u062e\u0645\u06cc\u0646\u06d2\u060c \u062c\u0648 \u062c\u0633\u0645\u0627\u0646\u06cc \u062e\u0631\u0627\u0628\u06cc\u0648\u06ba \u06a9\u0627 \u0628\u0627\u0639\u062b \u0628\u0646 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-debugging-qurt-applications\">QRT \u0627\u06cc\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646\u0632 \u06a9\u0648 \u0688\u06cc\u0628\u06af \u06a9\u0631\u0646\u0627<\/h2>\n<p>\u06a9\u06cc\u0648 \u0622\u0631 \u0679\u06cc \u0688\u06cc\u0628\u06af\u0646\u06af \u0644\u06cc\u0646\u06a9\u0633 \u0688\u06cc\u0628\u06af\u0646\u06af \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u0645\u062d\u062f\u0648\u062f \u06c1\u06d2\u06d4 \u0645\u0648\u062c\u0648\u062f \u0646\u06c1\u06cc\u06ba \u06c1\u06d2 <code>gdb<\/code> \u0645\u06cc\u06ba TUI \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u0648\u06ba\u060c \u0627\u0648\u0631 \u06a9\u0631\u06cc\u0634\u0648\u06ba \u06a9\u06cc \u0648\u062c\u06c1 \u0633\u06d2 \u062e\u0631\u0627\u0628\u06cc \u06a9\u06d2 \u067e\u06cc\u063a\u0627\u0645\u0627\u062a \u0627\u06a9\u062b\u0631 \u063a\u06cc\u0631 \u0645\u062f\u062f\u06af\u0627\u0631 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0645\u0646\u062f\u0631\u062c\u06c1 \u0630\u06cc\u0644 \u062a\u06a9\u0646\u06cc\u06a9\u0648\u06ba \u0633\u06d2 \u0627\u06cc\u06a9 \u0639\u0645\u0644\u06cc \u0688\u06cc\u0628\u06af\u0646\u06af \u0679\u0648\u0644 \u06a9\u0679 \u0628\u0646\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-printf-debugging\">\u0688\u06cc\u0628\u06af\u0646\u06af \u067e\u0631\u0646\u0679 \u0627\u06cc\u0641<\/h3>\n<pre><code class=\"language-c\">#include <stdio.h>\n\nvoid debug_example(void)\n{\n    printf(\"[%s:%d] value = %dn\", __func__, __LINE__, some_var);\n}\n<\/stdio.h><\/code><\/pre>\n<p>QRT \u0633\u067e\u0648\u0631\u0679 <code>printf<\/code> \u0627\u06cc\u06a9 \u0646\u06cc\u0645 \u0645\u06cc\u0632\u0628\u0627\u0646 \u0645\u06cc\u06a9\u0627\u0646\u0632\u0645 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2\u06d4 \u0633\u0645\u06cc\u0644\u06cc\u0679\u0631 \u0645\u06cc\u06ba\u060c \u0622\u0624\u0679 \u067e\u0679 stdout \u067e\u0631 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u06c1\u0627\u0631\u0688 \u0648\u06cc\u0626\u0631 \u0645\u06cc\u06ba\u060c \u06cc\u06c1 DIAG \u0628\u0641\u0631 \u067e\u0631 \u062c\u0627\u062a\u0627 \u06c1\u06d2 (Android \u0645\u06cc\u06ba logcat \u06a9\u06cc \u0637\u0631\u062d)\u06d4 \u06cc\u06c1 QRT \u06a9\u06cc \u062a\u0631\u0642\u06cc \u0645\u06cc\u06ba \u0633\u0628 \u0633\u06d2 \u0639\u0627\u0645 \u0688\u06cc\u0628\u06af\u0646\u06af \u062a\u06a9\u0646\u06cc\u06a9 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-qurt-error-codes\">QRT \u0627\u06cc\u0631\u0631 \u06a9\u0648\u0688\u0632<\/h3>\n<pre><code class=\"language-c\">switch (result) {\n    case QURT_EOK:\n        break;\n    case QURT_EINVALID:\n        printf(\"Invalid argumentn\");\n        break;\n    case QURT_EFAILED:\n        printf(\"General failuren\");\n        break;\n    case QURT_EMEM:\n        printf(\"Out of memoryn\");\n        break;\n    case QURT_ENOTALLOWED:\n        printf(\"Operation not allowed (check permissions)n\");\n        break;\n    case QURT_ETIMEOUT:\n        printf(\"Operation timed outn\");\n        break;\n    default:\n        printf(\"Unknown error: %dn\", result);\n}\n<\/code><\/pre>\n<p>\u06c1\u0645\u06cc\u0634\u06c1 QRT API \u06a9\u0627\u0644\u0632 \u06a9\u06cc \u0648\u0627\u067e\u0633\u06cc \u06a9\u06cc \u0642\u06cc\u0645\u062a \u0686\u06cc\u06a9 \u06a9\u0631\u06cc\u06ba\u06d4 \u063a\u0644\u0637\u06cc \u06a9\u06d2 \u06a9\u0648\u0688\u0632 \u062c\u0646 \u06a9\u0627 \u0622\u067e \u0627\u06a9\u062b\u0631 \u0633\u0627\u0645\u0646\u0627 \u06a9\u0631\u06cc\u06ba \u06af\u06d2 \u0648\u06c1 \u06c1\u06cc\u06ba:<\/p>\n<p><code>QURT_EINVALID<\/code>    \u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u0639\u0627\u0645 \u0637\u0648\u0631 \u067e\u0631 \u063a\u0644\u0637 \u067e\u06cc\u0631\u0627\u0645\u06cc\u0679\u0631\u0632 \u06c1\u0648\u062a\u0627 \u06c1\u06d2 (\u063a\u06cc\u0631 \u0645\u0646\u0633\u0644\u06a9 \u0627\u0633\u0679\u06cc\u06a9\u060c \u0646\u0627\u0644 \u067e\u0648\u0627\u0626\u0646\u0679\u0631\u060c \u062d\u062f \u0633\u06d2 \u0628\u0627\u06c1\u0631 \u06a9\u06cc \u062a\u0631\u062c\u06cc\u062d)\u06d4 <code>QURT_EMEM<\/code> \u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 \u06a9\u06c1 \u062f\u0627\u0646\u0627 \u06a9\u06d2 \u067e\u0627\u0633 \u0627\u067e\u0646\u06d2 \u0627\u0646\u062f\u0631\u0648\u0646\u06cc \u0688\u06be\u0627\u0646\u0686\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0627\u0641\u06cc \u0645\u06cc\u0645\u0648\u0631\u06cc \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 <code>QURT_ENOTALLOWED<\/code> \u0627\u06a9\u062b\u0631 \u0622\u067e \u06a9\u06d2 \u06c1\u0627\u0631\u0688 \u0648\u06cc\u0626\u0631 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u062c\u0627\u0632\u062a \u06a9\u06d2 \u0645\u0633\u0626\u0644\u06d2 \u06a9\u06cc \u0646\u0634\u0627\u0646\u062f\u06c1\u06cc \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-thread-state-inspection\">\u062a\u06be\u0631\u06cc\u0688 \u0627\u0633\u0679\u06cc\u0679 \u0686\u06cc\u06a9<\/h3>\n<pre><code class=\"language-c\">void dump_thread_info(void)\n{\n    qurt_thread_t tid = qurt_thread_get_id();\n    char name[QURT_THREAD_ATTR_NAME_MAXLEN];\n\n    qurt_thread_get_name(name, sizeof(name));\n\n    printf(\"Thread: %s (ID: %lu)n\", name, tid);\n}\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u0641\u0646\u06a9\u0634\u0646 \u0645\u0648\u062c\u0648\u062f\u06c1 \u062a\u06be\u0631\u06cc\u0688 \u06a9\u0627 \u0646\u0627\u0645 \u0627\u0648\u0631 ID \u067e\u0631\u0646\u0679 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0627\u0633 \u0648\u0642\u062a \u0645\u0641\u06cc\u062f \u06c1\u06d2 \u062c\u0628 \u0622\u067e \u06a9\u06d2 \u067e\u0627\u0633 \u0627\u06cc\u06a9 \u06c1\u06cc \u0644\u0627\u06af \u0622\u0624\u0679 \u067e\u0679 \u067e\u0631 \u0645\u062a\u0639\u062f\u062f \u062a\u06be\u0631\u06cc\u0688\u0632 \u0644\u06a9\u06be\u06d2 \u06c1\u0648\u0626\u06d2 \u06c1\u0648\u06ba \u0627\u0648\u0631 \u0622\u067e \u06a9\u0648 \u06cc\u06c1 \u0641\u0631\u0642 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648 \u06a9\u06c1 \u06c1\u0631 \u067e\u06cc\u063a\u0627\u0645 \u06a9\u0648 \u06a9\u0633 \u062a\u06be\u0631\u06cc\u0688 \u0646\u06d2 \u062a\u06cc\u0627\u0631 \u06a9\u06cc\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-stack-overflow-detection\">\u0627\u0633\u0679\u06cc\u06a9 \u0627\u0648\u0648\u0631 \u0641\u0644\u0648 \u06a9\u0627 \u067e\u062a\u06c1 \u0644\u06af\u0627\u0646\u0627<\/h3>\n<pre><code class=\"language-c\">#define STACK_CANARY 0xDEADBEEF\n\nstatic char my_stack[STACK_SIZE] __attribute__((aligned(8)));\n\nvoid init_stack_canary(void)\n{\n    \/* Write canary at the bottom of the stack *\/\n    ((unsigned int *)my_stack)[0] = STACK_CANARY;\n    ((unsigned int *)my_stack)[1] = STACK_CANARY;\n}\n\nvoid check_stack_canary(void)\n{\n    if (((unsigned int *)my_stack)[0] != STACK_CANARY ||\n        ((unsigned int *)my_stack)[1] != STACK_CANARY) {\n        printf(\"STACK OVERFLOW DETECTED!n\");\n    }\n}\n<\/code><\/pre>\n<p>QRT \u0627\u0633\u0679\u06cc\u06a9 \u0627\u0648\u0648\u0631 \u0641\u0644\u0648 \u06a9\u0627 \u067e\u062a\u06c1 \u0646\u06c1\u06cc\u06ba \u0644\u06af\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u06a9\u06cc\u0646\u0631\u06cc \u067e\u06cc\u0679\u0631\u0646 \u062a\u06be\u0631\u06cc\u0688 \u0634\u0631\u0648\u0639 \u06c1\u0648\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0627\u0633\u0679\u06cc\u06a9 \u06a9\u06d2 \u0646\u06cc\u0686\u06d2 \u0627\u06cc\u06a9 \u0645\u0639\u0644\u0648\u0645 \u0642\u062f\u0631 \u0644\u06a9\u06be\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u06af\u0631 \u0627\u0633\u0679\u06cc\u06a9 \u0628\u0627\u0624\u0646\u0688\u0631\u06cc \u0633\u06d2 \u0646\u06cc\u0686\u06d2 \u06a9\u06cc \u0637\u0631\u0641 \u0628\u0691\u06be\u062a\u0627 \u06c1\u06d2 \u062a\u0648 \u06a9\u06cc\u0646\u0631\u06cc \u0648\u06cc\u0644\u06cc\u0648 \u0627\u0648\u0648\u0631 \u0631\u0627\u0626\u0679 \u06c1\u0648 \u062c\u0627\u062a\u06cc \u06c1\u06d2\u06d4 \u06a9\u06cc\u0646\u0631\u06cc\u0632 \u06a9\u0648 \u0648\u0642\u062a\u0627\u064b \u0641\u0648\u0642\u062a\u0627\u064b \u0686\u06cc\u06a9 \u06a9\u0631\u0646\u0627 (\u06cc\u0627 \u062c\u0628 \u06a9\u0648\u0626\u06cc \u062f\u06be\u0627\u06af\u06c1 \u0646\u06a9\u0644\u062a\u0627 \u06c1\u06d2) \u0627\u0648\u0648\u0631 \u0641\u0644\u0648 \u067e\u06a9\u0691\u062a\u0627 \u06c1\u06d2 \u062c\u0648 \u0646\u0627\u0645\u0639\u0644\u0648\u0645 \u0627\u0648\u0631 \u063a\u06cc\u0631 \u0645\u062a\u0639\u0644\u0642\u06c1 \u062a\u0646\u0627\u0632\u0639\u0627\u062a \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0638\u0627\u06c1\u0631 \u06c1\u0648 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-using-the-hexagon-simulator\">\u0645\u0633\u062f\u0633 \u0633\u0645\u06cc\u0644\u06cc\u0679\u0631 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2<\/h3>\n<pre><code class=\"language-bash\"># Run with instruction tracing\nhexagon-sim --timing --pmu_statsfile stats.txt \n    --cosim_file osam.cfg \n    -- bootimg.pbn -- my_app.so\n\n# The stats file gives you:\n# - Total cycles\n# - Cache hit\/miss rates\n# - Stall cycles\n# - Instructions per cycle (IPC)\n<\/code><\/pre>\n<p>\u06a9\u06c1 <code>--timing<\/code> \u062c\u06be\u0646\u0688\u0627 \u0633\u0627\u0626\u06cc\u06a9\u0644 \u06a9\u06d2 \u062f\u0631\u0633\u062a \u062a\u062e\u0631\u0648\u067e\u0646 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4 <code>--pmu_statsfile<\/code> \u06a9\u0627\u0631\u06a9\u0631\u062f\u06af\u06cc \u06a9\u0627\u0624\u0646\u0679\u0631 \u0688\u06cc\u0679\u0627 \u0641\u0627\u0626\u0644 \u0645\u06cc\u06ba \u0644\u06a9\u06be\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u0639\u062f\u0627\u062f \u0648 \u0634\u0645\u0627\u0631 \u06a9\u06cc \u0641\u0627\u0626\u0644 \u06a9\u0644 \u0633\u0627\u0626\u06cc\u06a9\u0644\u060c \u06a9\u06cc\u0634 \u06c1\u0679 \u0627\u0648\u0631 \u0645\u0633 \u0631\u06cc\u0679\u0633\u060c \u0627\u0633\u0679\u0627\u0644 \u0633\u0627\u0626\u06cc\u06a9\u0644\u060c \u0627\u0648\u0631 \u06c1\u062f\u0627\u06cc\u0627\u062a \u0641\u06cc \u0633\u0627\u0626\u06cc\u06a9\u0644 (IPC) \u06a9\u06cc \u0631\u067e\u0648\u0631\u0679 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0688\u06cc\u0679\u0627 \u0627\u0633 \u0628\u0627\u062a \u06a9\u06cc \u0646\u0634\u0627\u0646\u062f\u06c1\u06cc \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0636\u0631\u0648\u0631\u06cc \u06c1\u06d2 \u06a9\u06c1 \u0622\u06cc\u0627 \u0631\u06a9\u0627\u0648\u0679 \u06a9\u0645\u067e\u06cc\u0648\u0679 \u06a9\u06cc \u062d\u062f\u0648\u062f\u060c \u0645\u06cc\u0645\u0648\u0631\u06cc \u06a9\u06cc \u062d\u062f\u0648\u062f\u060c \u06cc\u0627 \u062a\u0627\u062e\u06cc\u0631 \u06a9\u06cc \u062d\u062f\u0648\u062f \u06c1\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-common-pitfalls\">\u0639\u0627\u0645 \u0646\u0642\u0635\u0627\u0646\u0627\u062a<\/h2>\n<h3 id=\"heading-pitfall-1-forgetting-to-exit-threads\">\u0646\u0642\u0635\u0627\u0646 1: \u062a\u06be\u0631\u06cc\u0688 \u06a9\u0648 \u062e\u062a\u0645 \u06a9\u0631\u0646\u0627 \u0628\u06be\u0648\u0644 \u062c\u0627\u0646\u0627<\/h3>\n<pre><code class=\"language-c\">\/* BAD: thread function returns without exit *\/\nvoid bad_thread(void *arg) {\n    do_work();\n    return;  \/* CRASH or undefined behavior *\/\n}\n\n\/* GOOD *\/\nvoid good_thread(void *arg) {\n    do_work();\n    qurt_thread_exit(QURT_EOK);\n}\n<\/code><\/pre>\n<p>QRT \u062a\u06be\u0631\u06cc\u0688 \u0628\u063a\u06cc\u0631 \u06a9\u0627\u0644 \u06a9\u06d2 \u0627\u0646 \u067e\u0679 \u0641\u0646\u06a9\u0634\u0646 \u0633\u06d2 \u0644\u0648\u0679 \u0631\u06c1\u0627 \u06c1\u06d2\u06d4 <code>qurt_thread_exit()<\/code> \u0627\u0633 \u06a9\u06d2 \u0646\u062a\u06cc\u062c\u06d2 \u0645\u06cc\u06ba \u063a\u06cc\u0631 \u0645\u062a\u0639\u06cc\u0646\u06c1 \u0633\u0644\u0648\u06a9 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4 \u062f\u0627\u0646\u0627 \u0644\u0646\u06a9 \u0631\u062c\u0633\u0679\u0631 \u06a9\u0648 \u0627\u0633 \u067e\u0631 \u0633\u06cc\u0679 \u06a9\u0631\u062a\u0627 \u06c1\u06d2: <code>qurt_thread_exit<\/code> \u062f\u06be\u0627\u06af\u06d2 \u06a9\u06cc \u062a\u062e\u0644\u06cc\u0642 \u06a9\u06d2 \u062f\u0648\u0631\u0627\u0646 \u0627\u0633\u06d2 \u062d\u0641\u0627\u0638\u062a\u06cc \u062c\u0627\u0644 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u0627\u0633 \u067e\u0631 \u0628\u06be\u0631\u0648\u0633\u06c1 \u0646\u06c1\u06cc\u06ba \u06a9\u06cc\u0627 \u062c\u0627\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u06d4 \u06c1\u0645\u06cc\u0634\u06c1 \u0645\u062c\u06be\u06d2 \u06a9\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u06d4 <code>qurt_thread_exit()<\/code> \u0648\u0627\u0636\u062d \u0637\u0648\u0631 \u067e\u0631\u06d4<\/p>\n<h3 id=\"heading-pitfall-2-stack-allocated-in-wrong-scope\">\u0646\u0642\u0635\u0627\u0646 2: \u063a\u0644\u0637 \u062f\u0627\u0626\u0631\u06c1 \u06a9\u0627\u0631 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u062e\u062a\u0635 \u0627\u0633\u0679\u06cc\u06a9<\/h3>\n<pre><code class=\"language-c\">\/* BAD: stack is on the calling thread's stack *\/\nvoid create_thread_bad(void) {\n    char stack[4096];\n    qurt_thread_attr_set_stack_addr(&attr, stack);\n    qurt_thread_create(&tid, &attr, func, NULL);\n}   \/* stack disappears here, new thread crashes *\/\n\n\/* GOOD: use static or heap allocation *\/\nstatic char stack[4096] __attribute__((aligned(8)));\nvoid create_thread_good(void) {\n    qurt_thread_attr_set_stack_addr(&attr, stack);\n    qurt_thread_create(&tid, &attr, func, NULL);\n}\n<\/code><\/pre>\n<p>\u0627\u0633\u0679\u06cc\u06a9 \u0645\u06cc\u0645\u0648\u0631\u06cc \u06a9\u0648 \u0627\u0646 \u062a\u06be\u0631\u06cc\u0688\u0632 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u0632\u0646\u062f\u06c1 \u0631\u06c1\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2 \u062c\u0648 \u0627\u0633\u06d2 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u0633\u0679\u06cc\u06a9 \u06a9\u0648 \u06a9\u0633\u06cc \u0641\u0646\u06a9\u0634\u0646 \u0645\u06cc\u06ba \u0645\u0642\u0627\u0645\u06cc \u0645\u062a\u063a\u06cc\u0631 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0645\u062e\u062a\u0635 \u06a9\u0631\u0646\u0627 \u0627\u0633\u0679\u06cc\u06a9 \u06a9\u0648 \u0622\u0632\u0627\u062f \u06a9\u0631 \u062f\u06d2 \u06af\u0627 \u062c\u0628 \u0648\u06c1 \u0641\u0646\u06a9\u0634\u0646 \u0648\u0627\u067e\u0633 \u0622\u062c\u0627\u0626\u06d2 \u06af\u0627\u060c \u0644\u06cc\u06a9\u0646 \u062a\u06be\u0631\u06cc\u0688 \u0627\u0628 \u0628\u06be\u06cc \u0686\u0644 \u0631\u06c1\u0627 \u06c1\u0648\u06af\u0627\u06d4 \u0645\u062d\u062a\u0627\u0637 \u0644\u0627\u0626\u0641 \u0679\u0627\u0626\u0645 \u0645\u06cc\u0646\u062c\u0645\u0646\u0679 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u062c\u0627\u0645\u062f \u0645\u062e\u062a\u0635 (\u062c\u06cc\u0633\u0627 \u06a9\u06c1 \u062f\u06a9\u06be\u0627\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2) \u06cc\u0627 \u06c1\u06cc\u067e \u0627\u06cc\u0644\u0648\u06a9\u06cc\u0634\u0646 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-pitfall-3-priority-inversion-without-awareness\">\u0646\u0642\u0635\u0627\u0646 3: \u0627\u0633 \u06a9\u0627 \u0627\u062d\u0633\u0627\u0633 \u06a9\u06cc\u06d2 \u0628\u063a\u06cc\u0631 \u062a\u0631\u062c\u06cc\u062d\u0627\u062a \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u0646\u0627<\/h3>\n<pre><code class=\"language-c\">\/* BAD: manual spinlock, no priority inheritance *\/\nvolatile int lock = 0;\nwhile (__sync_lock_test_and_set(&lock, 1)) { \/* spin *\/ }\n\n\/* GOOD: QuRT mutex with priority inheritance *\/\nqurt_mutex_lock(&my_mutex);\n<\/code><\/pre>\n<p>\u0627\u06af\u0631 \u0627\u06cc\u06a9 \u0627\u0639\u0644\u06cc \u062a\u0631\u062c\u06cc\u062d\u06cc \u062f\u06be\u0627\u06af\u06c1 \u06a9\u0645 \u062a\u0631\u062c\u06cc\u062d\u06cc \u062f\u06be\u0627\u06af\u06d2 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0631\u06a9\u06be\u06d2 \u06af\u0626\u06d2 \u063a\u06cc\u0631 \u0641\u0639\u0627\u0644 \u0627\u0633\u067e\u0646 \u0644\u0627\u06a9 \u067e\u0631 \u06af\u06be\u0648\u0645\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u062f\u0631\u0645\u06cc\u0627\u0646\u06cc \u062a\u0631\u062c\u06cc\u062d\u06cc \u062f\u06be\u0627\u06af\u06c1 \u0644\u0627\u06a9 \u06c1\u0648\u0644\u0688\u0631 \u06a9\u0648 \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u0631\u0648\u06a9\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u0627\u0639\u0644\u06cc \u062a\u0631\u062c\u06cc\u062d\u06cc \u062f\u06be\u0627\u06af\u06d2 \u06a9\u0648 \u062f\u0631\u0645\u06cc\u0627\u0646\u06d2 \u062a\u0631\u062c\u06cc\u062d\u06cc \u062f\u06be\u0627\u06af\u06d2 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0645\u0624\u062b\u0631 \u0637\u0631\u06cc\u0642\u06d2 \u0633\u06d2 \u0631\u0648\u06a9 \u062f\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>QRT mutexes \u0627\u0633 \u0645\u0633\u0626\u0644\u06d2 \u06a9\u0648 \u062e\u0648\u062f\u06a9\u0627\u0631 \u062a\u0631\u062c\u06cc\u062d\u06cc \u0648\u0631\u0627\u062b\u062a \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u062d\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0644\u0627\u06a9 \u06c1\u0648\u0644\u0688\u0631 \u06a9\u0648 \u0639\u0627\u0631\u0636\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0633\u0628 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u062a\u0631\u062c\u06cc\u062d\u06cc \u0648\u06cc\u0679\u0631 \u06a9\u06cc \u062a\u0631\u062c\u06cc\u062d \u067e\u0631 \u062a\u0631\u0642\u06cc \u062f\u06cc \u062c\u0627\u062a\u06cc \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0639\u0644\u0627\u062c \u062f\u0633\u062a\u06cc \u0627\u0633\u067e\u0646 \u0644\u0627\u06a9\u0633 \u067e\u0631 \u0644\u0627\u06af\u0648 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-pitfall-4-unaligned-memory\">\u0646\u0642\u0635\u0627\u0646 4: \u063a\u06cc\u0631 \u0645\u0646\u0633\u0644\u06a9 \u0645\u06cc\u0645\u0648\u0631\u06cc<\/h3>\n<pre><code class=\"language-c\">\/* BAD *\/\nchar stack[4096];\n\n\/* GOOD *\/\nchar stack[4096] __attribute__((aligned(8)));\n\n\/* For DMA buffers, you often need 256-byte alignment *\/\nchar dma_buffer[1024] __attribute__((aligned(256)));\n<\/code><\/pre>\n<p>\u062a\u06be\u0631\u06cc\u0688 \u0627\u0633\u0679\u06cc\u06a9 8 \u0628\u0627\u0626\u0679 \u0633\u06cc\u062f\u06be \u0645\u06cc\u06ba \u06c1\u0648\u0646\u0627 \u0636\u0631\u0648\u0631\u06cc \u06c1\u06d2\u06d4 \u0688\u06cc \u0627\u06cc\u0645 \u0627\u06d2 \u0628\u0641\u0631\u0632 \u06a9\u0648 \u0639\u0627\u0645 \u0637\u0648\u0631 \u067e\u0631 256 \u0628\u0627\u0626\u0679 \u0633\u06cc\u062f\u06be \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4 \u063a\u0644\u0637 \u062a\u0631\u062a\u06cc\u0628 \u0634\u062f\u06c1 \u0645\u06cc\u0645\u0648\u0631\u06cc \u06c1\u06cc\u06a9\u0633\u0627\u06af\u0648\u0646 \u0641\u0646 \u062a\u0639\u0645\u06cc\u0631 \u0645\u06cc\u06ba \u0633\u062e\u062a \u062e\u0631\u0627\u0628\u06cc\u0648\u06ba \u06a9\u0627 \u0633\u0628\u0628 \u0628\u0646\u062a\u06cc \u06c1\u06d2\u060c \u062c\u0648 \u06a9\u0645 \u0633\u06d2 \u06a9\u0645 \u062a\u0634\u062e\u06cc\u0635\u06cc \u0622\u0624\u0679 \u067e\u0679 \u067e\u06cc\u062f\u0627 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-pitfall-5-blocking-in-isr-context\">\u0646\u0642\u0635\u0627\u0646 5: ISR \u06a9\u06d2 \u062a\u0646\u0627\u0638\u0631 \u0645\u06cc\u06ba \u0628\u0644\u0627\u06a9 \u06a9\u0631\u0646\u0627<\/h3>\n<pre><code class=\"language-c\">\/* BAD: mutex_lock may block indefinitely *\/\nvoid isr_handler(void *arg) {\n    qurt_mutex_lock(&some_mutex);\n    qurt_mutex_unlock(&some_mutex);\n}\n\n\/* GOOD: non-blocking try_lock with fallback *\/\nvoid isr_handler(void *arg) {\n    if (qurt_mutex_try_lock(&some_mutex) == QURT_EOK) {\n        \/* Quick update *\/\n        qurt_mutex_unlock(&some_mutex);\n    } else {\n        \/* Defer to processing thread *\/\n        qurt_signal_set(&deferred_signal, DEFERRED_WORK);\n    }\n}\n<\/code><\/pre>\n<p>QRT ISR \u062a\u06be\u0631\u06cc\u0688\u0632 \u062a\u06a9\u0646\u06cc\u06a9\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0628\u0644\u0627\u06a9\u0646\u06af APIs \u06a9\u0648 \u06a9\u0627\u0644 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0644\u06cc\u06a9\u0646 \u0627\u06cc\u06a9 \u0627\u0639\u0644\u06cc \u062a\u0631\u062c\u06cc\u062d\u06cc \u0645\u062f\u0627\u062e\u0644\u062a \u0648\u0627\u0644\u06d2 \u06c1\u06cc\u0646\u0688\u0644\u0631 \u0645\u06cc\u06ba \u0627\u06cc\u0633\u0627 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u0628\u0644\u0627\u06a9 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u062d\u0627\u0644\u062a \u06a9\u06d2 \u062d\u0644 \u06c1\u0648\u0646\u06d2 \u062a\u06a9 \u0631\u06a9\u0627\u0648\u0679 \u067e\u0631\u0648\u0633\u06cc\u0633\u0646\u06af \u0631\u06a9 \u062c\u0627\u0626\u06d2 \u06af\u06cc\u06d4 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba <code>qurt_mutex_try_lock()<\/code> \u0627\u06af\u0631 \u063a\u06cc\u0631 \u0645\u0633\u062f\u0648\u062f \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u06a9\u0648\u0634\u0634 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062a\u0627\u0644\u0627 \u062f\u0633\u062a\u06cc\u0627\u0628 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u060c \u062a\u0648 \u06a9\u0627\u0645 \u06a9\u0648 \u06a9\u0645 \u062a\u0631\u062c\u06cc\u062d\u06cc \u062f\u06be\u0627\u06af\u06d2 \u062a\u06a9 \u0645\u0648\u062e\u0631 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0633\u06af\u0646\u0644 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-performance-optimization\">\u06a9\u0627\u0631\u06a9\u0631\u062f\u06af\u06cc \u06a9\u06cc \u0627\u0635\u0644\u0627\u062d<\/h2>\n<h3 id=\"heading-using-hvx-hexagon-vector-extensions\">\u06c1\u06cc\u06a9\u0633\u0627\u06af\u0648\u0646\u0644 \u0648\u06cc\u06a9\u0679\u0631 \u0627\u06cc\u06a9\u0633\u0679\u06cc\u0646\u0634\u0646 (HVX) \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644<\/h3>\n<pre><code class=\"language-c\">#include <hexagon_types.h>\n#include <hvx_hexagon_protos.h>\n\n\/* Process 128 bytes at once with HVX *\/\nvoid vectorized_gain(int16_t *audio, int num_samples, int16_t gain)\n{\n    HVX_Vector *vptr = (HVX_Vector *)audio;\n    HVX_Vector vgain = Q6_Vh_vsplat_R(gain);\n    int num_vectors = num_samples * sizeof(int16_t) \/ sizeof(HVX_Vector);\n\n    for (int i = 0; i < num_vectors; i++) {\n        vptr[i] = Q6_Vh_vmpy_VhVh_sat(vptr[i], vgain);\n    }\n}\n<\/hvx_hexagon_protos.h><\/hexagon_types.h><\/code><\/pre>\n<p>HVX \u06c1\u06cc\u06a9\u0633\u0627\u06af\u0648\u0646 DSP \u067e\u0631 128 \u0628\u0627\u0626\u0679 SIMD \u0622\u067e\u0631\u06cc\u0634\u0646 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u06a9\u06c1 <code>Q6_Vh_vsplat_R<\/code> \u0627\u0646\u062f\u0631\u0648\u0646\u06cc \u0641\u0646\u06a9\u0634\u0646 \u0648\u06cc\u06a9\u0679\u0631 \u0631\u062c\u0633\u0679\u0631 \u06a9\u06cc \u062a\u0645\u0627\u0645 \u0644\u06cc\u0646 \u0645\u06cc\u06ba \u0627\u0633\u06a9\u06cc\u0644\u0631 \u0648\u06cc\u0644\u06cc\u0648 \u06a9\u0648 \u0646\u0634\u0631 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 <code>Q6_Vh_vmpy_VhVh_sat<\/code> \u062f\u0648 \u0622\u062f\u06be\u06d2 \u0627\u0644\u0641\u0627\u0638 \u06a9\u06d2 \u0648\u06cc\u06a9\u0679\u0631\u0632 \u06a9\u06cc \u0633\u06cc\u0686\u0648\u0631\u06cc\u0679\u0646\u06af \u0636\u0631\u0628 \u06a9\u0648 \u0627\u0646\u062c\u0627\u0645 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u06cc\u06a9 \u0648\u0627\u062d\u062f HVX \u0627\u0646\u0633\u0679\u0631\u06a9\u0634\u0646 64 16 \u0628\u0679 \u0646\u0645\u0648\u0646\u0648\u06ba \u067e\u0631 \u06a9\u0627\u0631\u0631\u0648\u0627\u0626\u06cc \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u060c \u062c\u0648 \u0622\u0688\u06cc\u0648 \u0627\u0648\u0631 \u0633\u06af\u0646\u0644 \u067e\u0631\u0648\u0633\u06cc\u0633\u0646\u06af \u06a9\u06d2 \u06a9\u0627\u0645 \u06a9\u06d2 \u0628\u0648\u062c\u06be \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0633\u06a9\u06cc\u0644\u0631 \u06a9\u0648\u0688 \u067e\u0631 \u0632\u0628\u0631\u062f\u0633\u062a \u0631\u0641\u062a\u0627\u0631 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-locking-l2-cache-for-hot-data\">\u06af\u0631\u0645 \u0688\u06cc\u0679\u0627 \u06a9\u06d2 \u0644\u06cc\u06d2 L2 \u06a9\u06cc\u0634\u06d2 \u0644\u0627\u06a9\u0646\u06af<\/h3>\n<pre><code class=\"language-c\">void lock_cache_example(void)\n{\n    extern float fft_twiddle_factors[];\n    size_t twiddle_size = 1024 * sizeof(float);\n\n    \/* Pin data in L2 to prevent eviction *\/\n    qurt_mem_l2cache_lock((unsigned int)fft_twiddle_factors,\n                           twiddle_size);\n\n    \/* When done: *\/\n    qurt_mem_l2cache_unlock((unsigned int)fft_twiddle_factors,\n                             twiddle_size);\n}\n<\/code><\/pre>\n<p><code>qurt_mem_l2cache_lock()<\/code>    \u0645\u06cc\u0645\u0648\u0631\u06cc \u06a9\u06d2 \u0639\u0644\u0627\u0642\u06d2 \u06a9\u0648 L2 \u06a9\u06cc\u0634\u06d2 \u0645\u06cc\u06ba \u067e\u0646 \u06a9\u0631\u06a9\u06d2\u060c \u06cc\u06c1 \u062f\u06cc\u06af\u0631 \u06a9\u06cc\u0634 \u0679\u0631\u06cc\u0641\u06a9 \u06a9\u0648 \u0645\u06cc\u0645\u0648\u0631\u06cc \u06a9\u06d2 \u0639\u0644\u0627\u0642\u06d2 \u06a9\u0648 \u06c1\u0679\u0627\u0646\u06d2 \u0633\u06d2 \u0631\u0648\u06a9\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u062a\u0644\u0627\u0634 \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u062c\u062f\u0648\u0644\u0648\u06ba \u0627\u0648\u0631 \u0645\u0633\u062a\u0642\u0644 \u0688\u06cc\u0679\u0627 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u0641\u06cc\u062f \u06c1\u06d2 \u062c\u0646 \u062a\u06a9 \u06a9\u062b\u0631\u062a \u0633\u06d2 \u06c1\u0627\u0679 \u0644\u0648\u067e\u0633 \u062a\u06a9 \u0631\u0633\u0627\u0626\u06cc \u062d\u0627\u0635\u0644 \u06a9\u06cc \u062c\u0627\u062a\u06cc \u06c1\u06d2 (\u0645\u062b\u0627\u0644 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631\u060c FFT \u06af\u0631\u062f\u0634 \u06a9\u06d2 \u0639\u0648\u0627\u0645\u0644)\u06d4<\/p>\n<p>\u0627\u0633 \u062a\u06a9\u0646\u06cc\u06a9 \u06a9\u0648 \u0645\u0646\u062a\u062e\u0628 \u0637\u0631\u06cc\u0642\u06d2 \u0633\u06d2 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u060c \u06a9\u06cc\u0648\u0646\u06a9\u06c1 L2 \u0645\u06cc\u06ba \u0628\u06c1\u062a \u0632\u06cc\u0627\u062f\u06c1 \u0688\u06cc\u0679\u0627 \u0644\u0627\u06a9 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u062f\u0648\u0633\u0631\u06d2 \u062a\u06be\u0631\u06cc\u0688\u0632 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062f\u0633\u062a\u06cc\u0627\u0628 \u06a9\u06cc\u0634 \u06a9\u0645 \u06c1\u0648 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-avoiding-dynamic-memory-in-hot-paths\">\u06af\u0631\u0645 \u0631\u0627\u0633\u062a\u0648\u06ba \u067e\u0631 \u0645\u062a\u062d\u0631\u06a9 \u0645\u06cc\u0645\u0648\u0631\u06cc \u0633\u06d2 \u0628\u0686\u06cc\u06ba\u06d4<\/h3>\n<pre><code class=\"language-c\">\/* BAD: malloc in the audio processing loop *\/\nvoid process_audio_bad(void) {\n    while (1) {\n        float *temp = malloc(1024 * sizeof(float));\n        process(temp);\n        free(temp);\n    }\n}\n\n\/* GOOD: pre-allocate everything *\/\nstatic float temp_buffer[1024];\nvoid process_audio_good(void) {\n    while (1) {\n        process(temp_buffer);\n    }\n}\n<\/code><\/pre>\n<p><code>malloc<\/code>    \u0627\u0648\u0631 <code>free<\/code> \u0639\u0645\u0644 \u062f\u0631\u0622\u0645\u062f \u06a9\u0627 \u0648\u0642\u062a \u063a\u06cc\u0631 \u0645\u0642\u0631\u0631\u06c1 \u06c1\u06d2 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u06cc\u06c1 \u062f\u0633\u062a\u06cc\u0627\u0628 \u0641\u06c1\u0631\u0633\u062a \u06a9\u0648 \u0639\u0628\u0648\u0631 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0628\u0644\u0627\u06a9\u0633 \u06a9\u0648 \u062a\u0642\u0633\u06cc\u0645 \u06cc\u0627 \u0645\u0644\u0627\u06cc\u0627 \u062c\u0627 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0628\u062f\u062a\u0631\u06cc\u0646 \u0635\u0648\u0631\u062a \u0645\u06cc\u06ba \u06cc\u06c1 \u06a9\u0631\u0646\u0644 \u0633\u06d2 \u0627\u0636\u0627\u0641\u06cc \u0645\u06cc\u0645\u0648\u0631\u06cc \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0631 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>48 kHz \u067e\u0631 \u0686\u0644\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0631\u06cc\u0626\u0644 \u0679\u0627\u0626\u0645 \u0622\u0688\u06cc\u0648 \u067e\u0631\u0648\u0633\u06cc\u0633\u0646\u06af \u0644\u0648\u067e \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u06c1\u06cc \u0633\u0633\u062a \u0627\u0644\u0627\u0679\u06cc\u0634\u0646 \u0642\u0627\u0628\u0644 \u0633\u0645\u0627\u0639\u062a \u0646\u0645\u0648\u0646\u06d2 \u06a9\u0627 \u0633\u0628\u0628 \u0628\u0646 \u0633\u06a9\u062a\u06cc \u06c1\u06d2\u06d4 \u0627\u0628\u062a\u062f\u0627\u0621 \u06a9\u06d2 \u062f\u0648\u0631\u0627\u0646\u060c \u062a\u0645\u0627\u0645 \u0628\u0641\u0631\u0632 \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u0645\u062e\u062a\u0635 \u0627\u0648\u0631 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06cc\u06d2 \u062c\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-api-quick-reference\">API \u0641\u0648\u0631\u06cc \u062d\u0648\u0627\u0644\u06c1<\/h2>\n<pre><code class=\"language-plaintext\">\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502                    QuRT API Quick Reference                     \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 THREADS         \u2502                                               \u2502\n\u2502  create         \u2502 qurt_thread_create(&id, &attr, func, arg)     \u2502\n\u2502  exit           \u2502 qurt_thread_exit(status)                      \u2502\n\u2502  join           \u2502 qurt_thread_join(id, &status)                 \u2502\n\u2502  get id         \u2502 qurt_thread_get_id()                          \u2502\n\u2502  sleep          \u2502 qurt_timer_sleep(usec)                        \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 MUTEX           \u2502                                               \u2502\n\u2502  init           \u2502 qurt_mutex_init(&mutex)                       \u2502\n\u2502  lock           \u2502 qurt_mutex_lock(&mutex)                       \u2502\n\u2502  try lock       \u2502 qurt_mutex_try_lock(&mutex)                   \u2502\n\u2502  unlock         \u2502 qurt_mutex_unlock(&mutex)                     \u2502\n\u2502  destroy        \u2502 qurt_mutex_destroy(&mutex)                    \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 SIGNALS         \u2502                                               \u2502\n\u2502  init           \u2502 qurt_signal_init(&signal)                     \u2502\n\u2502  wait           \u2502 qurt_signal_wait(&sig, mask, attr)            \u2502\n\u2502  set            \u2502 qurt_signal_set(&signal, mask)                \u2502\n\u2502  clear          \u2502 qurt_signal_clear(&signal, mask)              \u2502\n\u2502  destroy        \u2502 qurt_signal_destroy(&signal)                  \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 TIMERS          \u2502                                               \u2502\n\u2502  create         \u2502 qurt_timer_create(&timer, &attr)              \u2502\n\u2502  delete         \u2502 qurt_timer_delete(timer)                      \u2502\n\u2502  sleep          \u2502 qurt_timer_sleep(usec)                        \u2502\n\u2502  ticks          \u2502 qurt_sysclock_get_hw_ticks()                  \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 MEMORY          \u2502                                               \u2502\n\u2502  cache flush    \u2502 qurt_mem_cache_clean(addr, sz, FLUSH)         \u2502\n\u2502  cache inval    \u2502 qurt_mem_cache_clean(addr, sz, INVALIDATE)    \u2502\n\u2502  l2 lock        \u2502 qurt_mem_l2cache_lock(addr, size)             \u2502\n\u2502  l2 unlock      \u2502 qurt_mem_l2cache_unlock(addr, size)           \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 SEMAPHORE       \u2502                                               \u2502\n\u2502  init           \u2502 qurt_sem_init_val(&sem, count)                \u2502\n\u2502  down (wait)    \u2502 qurt_sem_down(&sem)                           \u2502\n\u2502  up (post)      \u2502 qurt_sem_up(&sem)                             \u2502\n\u2502  destroy        \u2502 qurt_sem_destroy(&sem)                        \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 BARRIER         \u2502                                               \u2502\n\u2502  init           \u2502 qurt_barrier_init(&barrier, count)            \u2502\n\u2502  wait           \u2502 qurt_barrier_wait(&barrier)                   \u2502\n\u2502  destroy        \u2502 qurt_barrier_destroy(&barrier)                \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u062c\u062f\u0648\u0644 \u0632\u0645\u0631\u06c1 \u06a9\u06d2 \u0644\u062d\u0627\u0638 \u0633\u06d2 \u0645\u0646\u0638\u0645 \u0633\u0628 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06c1\u0648\u0646\u06d2 \u0648\u0627\u0644\u06d2 QRT API \u0641\u0646\u06a9\u0634\u0646\u0632 \u06a9\u06cc \u0641\u06c1\u0631\u0633\u062a \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4 \u0628\u0627\u0626\u06cc\u06ba \u06a9\u0627\u0644\u0645 \u0622\u067e\u0631\u06cc\u0634\u0646 \u06a9\u0627 \u0646\u0627\u0645 \u0628\u062a\u0627\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u062f\u0627\u0626\u06cc\u06ba \u06a9\u0627\u0644\u0645 \u0641\u0646\u06a9\u0634\u0646 \u06a9\u06d2 \u062f\u0633\u062a\u062e\u0637 \u062f\u06a9\u06be\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<ul>\n<li>\n<p>\u062a\u06be\u0631\u06cc\u0688 \u0622\u067e\u0631\u06cc\u0634\u0646\u0632 \u0645\u06cc\u06ba \u062a\u062e\u0644\u06cc\u0642\u060c \u062e\u062a\u0645\u060c \u0634\u0645\u0648\u0644\u06cc\u062a\u060c \u0627\u0648\u0631 \u0646\u06cc\u0646\u062f \u06a9\u06d2 \u0622\u067e\u0631\u06cc\u0634\u0646 \u0634\u0627\u0645\u0644 \u06c1\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p>Mutex \u0622\u067e\u0631\u06cc\u0634\u0646\u0632 \u0644\u0627\u06a9\u0646\u06af\u060c \u0679\u0631\u0627\u0626\u06cc \u0644\u0627\u06a9\u060c \u0627\u0648\u0631 \u0627\u0646\u0644\u0627\u06a9\u0646\u06af \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0633\u06af\u0646\u0644 \u0622\u067e\u0631\u06cc\u0634\u0646 \u0628\u0679 \u0645\u0627\u0633\u06a9 \u067e\u0631 \u0645\u0628\u0646\u06cc \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0627\u0646\u062a\u0638\u0627\u0631 \u06a9\u0631\u0646\u06d2\u060c \u0633\u06cc\u0679 \u06a9\u0631\u0646\u06d2 \u0627\u0648\u0631 \u0635\u0627\u0641 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u062d\u0645\u0627\u06cc\u062a \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0679\u0627\u0626\u0645\u0631 \u06a9\u06d2 \u06a9\u0627\u0645 \u062a\u062e\u0644\u06cc\u0642\u060c \u062d\u0630\u0641\u060c \u0646\u06cc\u0646\u062f\u060c \u0627\u0648\u0631 \u06c1\u0627\u0631\u0688\u0648\u06cc\u0626\u0631 \u0679\u06a9 \u06a9\u0627\u0624\u0646\u0679\u0631\u0632 \u06a9\u0648 \u067e\u0691\u06be\u0646\u06d2 \u06a9\u0648 \u0633\u0646\u0628\u06be\u0627\u0644\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0645\u06cc\u0645\u0648\u0631\u06cc \u0622\u067e\u0631\u06cc\u0634\u0646\u0632 \u0645\u06cc\u06ba \u06a9\u06cc\u0634 \u0641\u0644\u0634\u0632 \u0627\u0648\u0631 \u063a\u0644\u0637\u06cc\u0627\u06ba (\u06a9\u0631\u0627\u0633 \u067e\u0631\u0648\u0633\u06cc\u0633\u0631 \u0628\u0641\u0631\u0632 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0636\u0631\u0648\u0631\u06cc) \u0627\u0648\u0631 \u06a9\u0627\u0631\u06a9\u0631\u062f\u06af\u06cc \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06c1\u0645 \u0688\u06cc\u0679\u0627 \u06a9\u06d2 \u0644\u06cc\u06d2 L2 \u06a9\u06cc\u0634 \u0644\u0627\u06a9 \u0634\u0627\u0645\u0644 \u06c1\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0633\u06cc\u0645\u0641\u0648\u0631 \u0627\u0648\u0631 \u0628\u06cc\u0631\u06cc\u0626\u0631 \u0622\u067e\u0631\u06cc\u0634\u0646\u0632 \u06c1\u0645 \u0648\u0642\u062a \u0633\u0627\u0632\u06cc \u06a9\u06d2 \u067e\u0631\u0627\u0626\u0645\u06cc\u0679\u0648\u0632 \u06a9\u0648 \u067e\u0648\u0631\u0627 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<\/ul>\n<h2 id=\"heading-next-steps\">\u0627\u06af\u0644\u06d2 \u0627\u0642\u062f\u0627\u0645\u0627\u062a<\/h2>\n<p>\u0627\u0633 \u06c1\u06cc\u0646\u0688 \u0628\u06a9 \u0645\u06cc\u06ba QRT \u067e\u0631\u0648\u06af\u0631\u0627\u0645\u0646\u06af \u06a9\u06d2 \u0628\u0646\u06cc\u0627\u062f\u06cc \u0627\u0635\u0648\u0644\u0648\u06ba \u06a9\u0627 \u0627\u062d\u0627\u0637\u06c1 \u06a9\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u060c \u0628\u0634\u0645\u0648\u0644 \u062a\u06be\u0631\u06cc\u0688 \u0645\u06cc\u0646\u062c\u0645\u0646\u0679\u060c \u0633\u0646\u06a9\u0631\u0648\u0646\u0627\u0626\u0632\u06cc\u0634\u0646\u060c \u0645\u06cc\u0645\u0648\u0631\u06cc\u060c \u0679\u0627\u0626\u0645\u0631\u0632\u060c \u0627\u0646\u0679\u0631\u067e\u0679\u0633\u060c \u067e\u0627\u0626\u067e\u0633\u060c \u0641\u0627\u0633\u0679 \u0622\u0631 \u067e\u06cc \u0633\u06cc\u060c \u0627\u0648\u0631 \u0645\u0644\u0679\u06cc \u0633\u06cc\u0646\u0633\u0631 \u0641\u06cc\u0648\u0698\u0646 \u067e\u0627\u0626\u067e \u0644\u0627\u0626\u0646\u06d4 \u06af\u06c1\u0631\u0627\u0626\u06cc \u0633\u06d2 \u0633\u06cc\u06a9\u06be\u0646\u06d2 \u06a9\u06d2 \u0627\u06af\u0644\u06d2 \u0645\u0631\u0627\u062d\u0644 \u0642\u062f\u0631\u062a\u06cc \u067e\u06cc\u0634\u0631\u0641\u062a \u06a9\u06cc \u067e\u06cc\u0631\u0648\u06cc \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0633\u0628 \u0633\u06d2 \u067e\u06c1\u0644\u06d2\u060c \u06c1\u06cc\u06a9\u0633\u0627\u06af\u0648\u0646 SDK \u0688\u0627\u0624\u0646 \u0644\u0648\u0688 \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 \u0633\u0645\u06cc\u0644\u06cc\u0679\u0631 \u0645\u06cc\u06ba \u0634\u0627\u0645\u0644 \u0645\u062b\u0627\u0644 \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679\u0633 \u06a9\u0648 \u0686\u0644\u0627\u0626\u06cc\u06ba\u06d4 \u06a9\u06cc \u0645\u062b\u0627\u0644 <code>$HEXAGON_SDK_ROOT\/examples\/<\/code> \u06cc\u06c1 FastRPC \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u062d\u0642\u06cc\u0642\u06cc ARM-DSP \u06a9\u0645\u06cc\u0648\u0646\u06cc\u06a9\u06cc\u0634\u0646 \u067e\u06cc\u0679\u0631\u0646 \u06a9\u0648 \u0638\u0627\u06c1\u0631 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u06cc\u06a9 \u0645\u06a9\u0645\u0644 \u0627\u0648\u0631 \u06a9\u0627\u0645 \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u06a9\u0648 \u06cc\u0642\u06cc\u0646\u06cc \u0628\u0646\u0627\u0646\u06d2 \u06a9\u0627 \u0628\u06c1\u062a\u0631\u06cc\u0646 \u0637\u0631\u06cc\u0642\u06c1 \u06c1\u06d2\u06d4<\/p>\n<p>QRT \u06cc\u0648\u0632\u0631 \u06af\u0627\u0626\u06cc\u0688 \u067e\u0691\u06be\u06cc\u06ba\u06d4 <code>$HEXAGON_SDK_ROOT\/docs\/<\/code>. \u0627\u0633 \u0645\u06cc\u06ba \u0627\u0633 \u0645\u0636\u0645\u0648\u0646 \u0645\u06cc\u06ba \u0632\u06cc\u0631 \u0628\u062d\u062b \u062a\u0645\u0627\u0645 APIs \u06a9\u0627 \u062a\u0641\u0635\u06cc\u0644 \u0633\u06d2 \u0627\u062d\u0627\u0637\u06c1 \u06a9\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u060c \u0646\u06cc\u0632 \u0628\u06c1\u062a \u0633\u06d2 \u0627\u06cc\u0633\u06d2 \u06c1\u06cc\u06ba \u062c\u0646 \u06a9\u0627 \u0627\u062d\u0627\u0637\u06c1 \u0646\u06c1\u06cc\u06ba \u06a9\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2 (\u062c\u06cc\u0633\u06d2 QRT \u06a9\u0627 TLB \u0645\u06cc\u0646\u062c\u0645\u0646\u0679 \u0627\u0648\u0631 \u067e\u0627\u0648\u0631 \u0645\u06cc\u0646\u062c\u0645\u0646\u0679 \u0627\u0646\u0679\u0631\u0641\u06cc\u0633)\u06d4<\/p>\n<p>HVX\u060c \u06c1\u06cc\u06a9\u0633\u0627\u06af\u0648\u0646 \u0648\u06cc\u06a9\u0679\u0631 \u0627\u06cc\u06a9\u0633\u0679\u06cc\u0646\u0634\u0646 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u062a\u062c\u0631\u0628\u06c1 \u06a9\u0631\u06cc\u06ba\u06d4 HVX \u0648\u06c1 \u062c\u06af\u06c1 \u06c1\u06d2 \u062c\u06c1\u0627\u06ba \u06c1\u06cc\u06a9\u0633\u0627\u06af\u0648\u0646 DSP \u06a9\u06cc \u0627\u0635\u0644 \u0637\u0627\u0642\u062a \u06a9\u0627\u0645 \u0645\u06cc\u06ba \u0622\u062a\u06cc \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0648\u06cc\u06a9\u0679\u0631\u0627\u0626\u0632\u0688 DSP \u06a9\u0648\u0688 \u0644\u06a9\u06be\u0646\u06d2 \u06a9\u0627 \u0637\u0631\u06cc\u0642\u06c1 \u0633\u06cc\u06a9\u06be\u0646\u0627 \u0622\u067e \u06a9\u06d2 \u0644\u06cc\u06d2 \u062f\u0633\u062a\u06cc\u0627\u0628 \u0648\u0627\u062d\u062f \u0633\u0628 \u0633\u06d2 \u0628\u0691\u0627 \u067e\u0631\u0641\u0627\u0631\u0645\u0646\u0633 \u0644\u06cc\u0648\u0631 \u06c1\u06d2\u06d4<\/p>\n<p>\u0622\u062e\u0631 \u0645\u06cc\u06ba\u060c \u0627\u067e\u0646\u06d2 \u06a9\u0648\u0688 \u06a9\u0648 \u0627\u0635\u0644\u06cc \u06c1\u0627\u0631\u0688 \u0648\u06cc\u0626\u0631 \u067e\u0631 \u0686\u0644\u0627\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u0688\u0648\u06cc\u0644\u067e\u0645\u0646\u0679 \u0628\u0648\u0631\u0688 (\u062c\u06cc\u0633\u06d2 Qualcomm RB5) \u062e\u0631\u06cc\u062f\u06cc\u06ba\u06d4 \u0633\u0645\u06cc\u0644\u06cc\u0679\u0631 \u062f\u0631\u0633\u062a\u06af\u06cc \u06a9\u06cc \u062a\u0635\u062f\u06cc\u0642 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0644\u06cc\u06a9\u0646 \u0635\u0631\u0641 \u0627\u0635\u0644\u06cc \u06c1\u0627\u0631\u0688\u0648\u06cc\u0626\u0631 \u06c1\u06cc \u0648\u0642\u062a \u06a9\u06d2 \u0631\u0648\u06cc\u06d2\u060c \u06a9\u06cc\u0634\u06d2 \u06a9\u06d2 \u0627\u062b\u0631\u0627\u062a\u060c \u0627\u0648\u0631 \u0622\u067e \u06a9\u06d2 \u06a9\u0648\u0688 \u0627\u0648\u0631 DSP \u067e\u0631 \u0686\u0644\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u062f\u0648\u0633\u0631\u06d2 \u0633\u0627\u0641\u0679 \u0648\u06cc\u0626\u0631 \u06a9\u06d2 \u062f\u0631\u0645\u06cc\u0627\u0646 \u062a\u0639\u0627\u0645\u0644 \u06a9\u0648 \u0638\u0627\u06c1\u0631 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-recommended-reading\">\u062a\u062c\u0648\u06cc\u0632 \u06a9\u0631\u062f\u06c1 \u06a9\u062a\u0627\u0628\u06cc\u06ba\u06d4<\/h3>\n<p>Hexagon SDK \u062f\u0633\u062a\u0627\u0648\u06cc\u0632\u0627\u062a \u06cc\u06c1\u0627\u06ba \u067e\u0631 \u0648\u0627\u0642\u0639 \u06c1\u06d2: <code>(HEXAGON_SDK_ROOT\/docs\/<\/code>. QRT API \u062d\u0648\u0627\u0644\u06c1 \u06cc\u06c1\u0627\u06ba \u0645\u0648\u062c\u0648\u062f \u06c1\u06d2: <code>)HEXAGON_SDK_ROOT\/docs\/qurt\/<\/code>. Qualcomm Developer Network (developer.qualcomm.com) \u0627\u0636\u0627\u0641\u06cc \u0648\u0633\u0627\u0626\u0644\u060c \u0641\u0648\u0631\u0645\u0632\u060c \u0627\u0648\u0631 \u0627\u06cc\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0646\u0648\u0679\u0633 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u06c1\u06cc\u06a9\u0633\u0627\u06af\u0648\u0646 \u0688\u06cc \u0627\u06cc\u0633 \u067e\u06cc \u0622\u0631\u06a9\u06cc\u0679\u06cc\u06a9\u0686\u0631 \u062d\u0648\u0627\u0644\u06c1 \u062e\u0648\u062f \u06c1\u0627\u0631\u0688 \u0648\u06cc\u0626\u0631 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062d\u062a\u0645\u06cc \u06af\u0627\u0626\u06cc\u0688 \u06c1\u06d2\u06d4<\/p>\n<p>QRT \u0627\u06cc\u06a9 \u062f\u0631\u0633\u062a \u0622\u0644\u06c1 \u06c1\u06d2\u06d4 \u0622\u067e \u0627\u0633\u06d2 \u0686\u06be\u0648 \u0646\u06c1\u06cc\u06ba \u0633\u06a9\u062a\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u06cc\u06c1 \u062f\u0646\u06cc\u0627 \u06a9\u06d2 \u0633\u0628 \u0633\u06d2 \u0637\u0627\u0642\u062a\u0648\u0631 \u0688\u06cc \u0627\u06cc\u0633 \u067e\u06cc \u0622\u0631\u06a9\u06cc\u0679\u06cc\u06a9\u0686\u0631\u0632 \u0645\u06cc\u06ba \u0633\u06d2 \u0627\u06cc\u06a9 \u0645\u06cc\u06ba \u0631\u06cc\u0626\u0644 \u0679\u0627\u0626\u0645 \u067e\u0631\u0648\u0633\u06cc\u0633\u0646\u06af \u067e\u0631 \u0645\u0627\u0626\u06cc\u06a9\u0631\u0648 \u0633\u06cc\u06a9\u0646\u0688 \u0644\u06cc\u0648\u0644 \u06a9\u0646\u0679\u0631\u0648\u0644 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0633\u06cc\u06a9\u06be\u0646\u06d2 \u06a9\u0627 \u0645\u0646\u062d\u0646\u06cc \u062e\u0637\u0648\u0637 \u0628\u06c1\u062a \u0628\u0691\u0627 \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u0627\u06cc\u06a9 \u0628\u0627\u0631 \u062c\u0628 \u0622\u067e \u0627\u06cc\u0633\u0627 \u06a9\u0631 \u0644\u06cc\u06ba\u060c \u062a\u0648 \u0622\u067e \u0633\u0645\u062c\u06be \u062c\u0627\u0626\u06cc\u06ba \u06af\u06d2 \u06a9\u06c1 \u0627\u0631\u0628\u0648\u06ba \u0688\u06cc\u0648\u0627\u0626\u0633\u0632 \u0627\u067e\u0646\u06d2 \u0627\u0646\u062a\u06c1\u0627\u0626\u06cc \u0627\u06c1\u0645 \u06a9\u0627\u0645\u0648\u06ba \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0633 \u0686\u06be\u0648\u0679\u06d2 OS \u067e\u0631 \u06a9\u06cc\u0648\u06ba \u0628\u06be\u0631\u0648\u0633\u06c1 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Qualcomm \u067e\u0631 \u0645\u0628\u0646\u06cc \u062a\u0645\u0627\u0645 \u0641\u0648\u0646\u0632 \u0645\u06cc\u06ba Hexagon DSP \u0648\u06cc\u06a9 \u0627\u067e \u06a9\u0631\u06cc\u06a9\u0679\u0631 \u0688\u06cc\u0679\u06cc\u06a9\u0634\u0646\u060c \u0633\u06cc\u0646\u0633\u0631 \u067e\u0631\u0648\u0633\u06cc\u0633\u0646\u06af\u060c \u0634\u0648\u0631 \u06a9\u06cc\u0646\u0633\u0644\u06cc\u0634\u0646\u060c \u0627\u0648\u0631 \u0628\u0644\u0648\u0679\u0648\u062a\u06be \u0622\u0688\u06cc\u0648 \u0627\u0633\u0679\u0631\u06cc\u0645\u0646\u06af \u06a9\u0648 \u06c1\u06cc\u0646\u0688\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u062c\u0628\u06a9\u06c1 \u0628\u0646\u06cc\u0627\u062f\u06cc ARM CPU \u0627\u06cc\u0646\u0688\u0631\u0627\u0626\u06cc\u0688 \u0686\u0644\u0627\u062a\u0627 \u06c1\u06d2\u06d4 DSP \u062c\u0633 \u0622\u067e\u0631\u06cc\u0679\u0646\u06af \u0633\u0633\u0679\u0645 \u06a9\u0648 \u0622\u067e\u0631\u06cc\u0679 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0648\u0622\u0631\u0688\u06cc\u0646\u06cc\u0679 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0648\u06c1 Qualcomm \u0631\u06cc\u0626\u0644 \u0679\u0627\u0626\u0645 \u0622\u067e\u0631\u06cc\u0679\u0646\u06af \u0633\u0633\u0679\u0645 (QRT) \u06c1\u06d2\u060c \u0627\u06cc\u06a9 POSIX \u062c\u06cc\u0633\u0627 \u062a\u0631\u062c\u06cc\u062d\u06cc [&hellip;]<\/p>\n","protected":false},"author":7,"featured_media":23617,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[1],"tags":[],"class_list":["post-23616","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog"],"_links":{"self":[{"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/posts\/23616","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/comments?post=23616"}],"version-history":[{"count":1,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/posts\/23616\/revisions"}],"predecessor-version":[{"id":23618,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/posts\/23616\/revisions\/23618"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/media\/23617"}],"wp:attachment":[{"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/media?parent=23616"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/categories?post=23616"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/tags?post=23616"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}