一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

【試用報(bào)告】RP2040上的MicroPython環(huán)境中多線程編程

電子發(fā)燒友論壇 ? 來(lái)源:未知 ? 2023-04-18 09:15 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

雙核介紹

BPI-Pico-RP2040官方介紹如下:



其核心是RP2040,采用的是ARM Cortex M0+ CPU內(nèi)核,運(yùn)行頻率高達(dá) 133 MHz。


比一般使用Cortex M0+的MCU更強(qiáng)大的是,RP2040使用了雙核ARM Cortex M0+,既然是雙核的,那么我們就可以在BPI-Pico-RP2040運(yùn)行多線程程序了,更好的挖掘出其潛力來(lái)。


多線程了解

關(guān)于什么是多線程,本文不講,大家可以自行查找資料詳細(xì)了解。


為了更方便的進(jìn)行測(cè)試,本次所有的實(shí)例,都是在python環(huán)境中進(jìn)行的。


經(jīng)過(guò)了解,circuitpython還不支持多線程,而micropython則已經(jīng)提供支持。


不過(guò)micropython中的多線程還是實(shí)驗(yàn)性質(zhì)的支持,這從官方文檔中可以了解:MicroPython libraries ? _thread – multithreading support



micropython官方為RP2040提供的最新固件為v1.19.1,其已提供對(duì)多線程的支持。


因?yàn)閙icropython的多線程基于CPython中的_thread模塊,所以可以從Python官方文檔了解其具體用法:_thread --- 底層多線程 API


如果是開(kāi)始使用多線程,那么先關(guān)注如下的調(diào)用,等熟悉了以后,再深入學(xué)習(xí)其他的:

  • _thread.start_new_thread(function, args[, kwargs]):開(kāi)啟一個(gè)新線程

  • _thread.allocate_lock():返回一個(gè)新的鎖對(duì)象

  • lock.acquire(blocking=True, timeout=- 1):申請(qǐng)獲得鎖

  • lock.release():釋放鎖


本文中所有的實(shí)例代碼,都可以從以下地址獲?。?/p>

Pico(RP2040)上的MicroPython環(huán)境中多線程編程https://gitee.com/honestqiao/multithread_in_micropython_on_pico


基礎(chǔ)多線程

首先,用一個(gè)簡(jiǎn)單的micropython程序,來(lái)控制板載的LED不同時(shí)間點(diǎn)亮和熄滅

# file: multicore_test01.py
import machine
import _thread
import utime


led = machine.Pin(25, machine.Pin.OUT)
led.off()


key = 0
start_time = 0
def run_on_core1():
global start_time
while start_time == 0:
pass


while True:
utime.sleep_ms(300)
print((utime.ticks_us()-start_time)//100000, "led on")
led.on()
utime.sleep_ms(700)

def run_on_core0():
global start_time
start_time = utime.ticks_us()
while True:
utime.sleep_ms(700)
print((utime.ticks_us()-start_time)//100000, "led off")
led.off()
utime.sleep_ms(300)


_thread.start_new_thread(run_on_core1, ( ))
run_on_core0()

(左右移動(dòng)查看全部?jī)?nèi)容)


在RP2040的micropython環(huán)境中,程序默認(rèn)在core0上運(yùn)行,使用_thread.start_new_thread()啟動(dòng)新的線程后,將會(huì)在core1上運(yùn)行。


上面的程序運(yùn)行后,具體輸出結(jié)果如下:



在run_on_core1中,先延時(shí)300ms,然后點(diǎn)亮led,再延時(shí)700ms,然后繼續(xù)循環(huán)


在run_on_core0中,先延時(shí)700ms,然后熄滅led,再延時(shí)300ms,然后繼續(xù)循環(huán)


從以上的輸出可以看到,點(diǎn)亮和熄滅led,都對(duì)應(yīng)到了對(duì)應(yīng)的時(shí)間點(diǎn)。


也許有人會(huì)說(shuō),這有啥用,我不用多線程,也完全可以在對(duì)應(yīng)的時(shí)間點(diǎn)點(diǎn)亮和熄滅LED,用多線程豈不是多此一舉。


上面的例子,是一個(gè)基礎(chǔ)的多線程演示,其只是在兩個(gè)線程中,控制同一個(gè)LED,所以會(huì)覺(jué)得意義不大。如果我們的程序要同時(shí)做兩件不同的事情,那么每件事情在一個(gè)core上運(yùn)行,互不干擾,就很重要的,在后面會(huì)有這樣的實(shí)例展示。


確認(rèn)雙線程

在不同的開(kāi)發(fā)板上,對(duì)多線程的支持,也是有差異的。


RP2040上的micropython,只能跑兩個(gè)線程,每個(gè)線程占用1個(gè)core,多了就會(huì)出錯(cuò)。


我們可以用下面的程序進(jìn)行驗(yàn)證:

# file: multicore_test02.py


import machine
import _thread
import utime


def thread_1():
while True:
print("thread_1")
utime.sleep_ms(1000)


def thread_2():
while True:
print("thread_2")
utime.sleep_ms(1000)


_thread.start_new_thread(thread_1, ( ))
_thread.start_new_thread(thread_2, ( ))


while True:
print("main")
utime.sleep_ms(1000)

(左右移動(dòng)查看全部?jī)?nèi)容)


運(yùn)行上面的程序后,將會(huì)出現(xiàn)如下的錯(cuò)誤信息:



其原因在于,主程序本身,使用了core0,而使用_thread.start_new_thread()創(chuàng)建一個(gè)線程時(shí),會(huì)自動(dòng)的使用core1,第二次調(diào)用_thread.start_new_thread()再次創(chuàng)建一個(gè)線程時(shí),無(wú)法再使用core1,所以就會(huì)出錯(cuò)。


在core1上運(yùn)行的子線程,需要使用_thread.start_new_thread()創(chuàng)建,所以其運(yùn)行的需要使用一個(gè)函數(shù)進(jìn)行調(diào)用作為入口。


而程序的主線程,運(yùn)行在core0上,可以直接在程序主流程中寫(xiě)運(yùn)行邏輯,也可以寫(xiě)一個(gè)函數(shù)調(diào)用,效果是一樣的。


后續(xù)的實(shí)例中,我們將使用run_on_core0()和run_on_core1()來(lái)區(qū)分在core0、core1的所運(yùn)行的線程。



線程間交互


全局變量

通常時(shí)候,讓兩個(gè)線程,分別做各自獨(dú)立的事情,可以運(yùn)行的很好。


但有的時(shí)候,我們可能還需要兩個(gè)之間,能夠有一些交流。


最簡(jiǎn)單的方法,就是使用一個(gè)全局變量,然后兩個(gè)線程之間,都調(diào)用這個(gè)全局變量即可。


下面用一個(gè)簡(jiǎn)單的程序進(jìn)行演示:

# file: multicore_test03.py
import machine
import _thread
import utime


led = machine.Pin(25, machine.Pin.OUT)
led.off()


status = 0
def run_on_core1():
global status
while True:
if status:
led.on()
else:
led.off()
utime.sleep_ms(100)

def run_on_core0():
global status
while True:
status = 1 if not status else 0
utime.sleep_ms(1000)


_thread.start_new_thread(run_on_core1, ( ))
run_on_core0()

(左右移動(dòng)查看全部?jī)?nèi)容)


在上面的程序中,core0上的程序,每隔1秒,將status取反一次。core1上的程序,則根據(jù)status的值,來(lái)點(diǎn)亮或者熄滅LED。


線程鎖

上面這個(gè)程序比較簡(jiǎn)單,處理起來(lái)的速度很快,所以這么實(shí)用,不會(huì)有什么問(wèn)題。


如果我們有一個(gè)程序需要兩個(gè)線程進(jìn)行配合,例如主線程進(jìn)行數(shù)據(jù)采集分析,而子線程進(jìn)行數(shù)據(jù)的呈現(xiàn),就有可能會(huì)出現(xiàn)問(wèn)題了。


我們看一看下面的程序:

# file: multicore_test04.py
import machine
import _thread
import utime


led = machine.Pin(25, machine.Pin.OUT)
led.off()


status = 0
data = []
def run_on_core1():
global status, data
while True:
if status:
led.on()
else:
led.off()
str_data = ''.join(data)
print("str_data: len=%d content=%s" % (len(str_data), str_data))
utime.sleep_ms(1000)

def run_on_core0():
global status, data
while True:
status = 1 if not status else 0
data = []
for i in range(100):
data.append(str(status))
utime.sleep_ms(10)
utime.sleep_ms(1000)


_thread.start_new_thread(run_on_core1, ( ))
run_on_core0()

(左右移動(dòng)查看全部?jī)?nèi)容)


在core0的主線程中,根據(jù)status的值,將data設(shè)置為100個(gè)0或者1;而在core1的子線程中,則將其值合并為字符串輸出出來(lái),輸出的同時(shí),顯示字符串的長(zhǎng)度。


運(yùn)行上面的程序后,實(shí)際輸出結(jié)果如下:



按說(shuō),其長(zhǎng)度,要么是空,要么是100,可是實(shí)際結(jié)果卻會(huì)出現(xiàn)不為100的情況呢?


這是因?yàn)椋琧ore0上的主線程在操作data,core1的子線程也在操作data,兩者都是在同時(shí)進(jìn)行的,而多個(gè)控制線程之間是共享全局?jǐn)?shù)據(jù)空間,那么就會(huì)出現(xiàn),core0上的主線程處理數(shù)據(jù)處理到到一半了,core1的子線程已經(jīng)開(kāi)始操作了,這樣就會(huì)出現(xiàn)問(wèn)題,數(shù)據(jù)不完整了。


顯然,這種情況,是我們所不期望的。那要解決這種情況,可以用一個(gè)全局變量作為標(biāo)志,主線程告訴子線程是否處理完成了,一旦處理完成了,子線程就可以開(kāi)始處理了。


但線程調(diào)用庫(kù)本身,有更好的辦法,那就是鎖。


我們先看下面的程序:

# file: multicore_test05.py
import machine
import _thread
import utime


led = machine.Pin(25, machine.Pin.OUT)
led.off()


status = 0
data = []
def run_on_core1():
global status, data
while True:
if status:
led.on()
else:
led.off()
lock.acquire()
str_data = ''.join(data)
print("str_data: len=%d content=%s" % (len(str_data), str_data))
lock.release()
utime.sleep_ms(1000)

def run_on_core0():
global status, data
while True:
status = 1 if not status else 0
lock.acquire()
data = []
for i in range(100):
data.append(str(status))
utime.sleep_ms(10)
lock.release()
utime.sleep_ms(1000)


lock = _thread.allocate_lock()
_thread.start_new_thread(run_on_core1, ( ))
run_on_core0()

(左右移動(dòng)查看全部?jī)?nèi)容)


在上面的程序中,啟動(dòng)線程之前,使用 _thread.allocate_lock() 來(lái)獲取一個(gè)新的鎖,然后在core0的主線程中,處理數(shù)據(jù)前,使用 lock.acquire() 獲得鎖,處理完成后,再使用lock.release()釋放鎖。


一但一個(gè)線程獲得鎖,那么其他線程想要獲得該鎖時(shí),只能等待直到這個(gè)鎖被釋放,也就是不能同時(shí)獲得,這在python中叫做互斥鎖。


因而,在core1的子線程,要輸出數(shù)據(jù)的時(shí)候,也使用同樣的機(jī)制來(lái)獲得和釋放鎖。


最終,data改變時(shí),其他地方需要等待改變完成。data輸出時(shí),其他地方也需要等待輸出完成。從而確保了任何時(shí)刻,對(duì)只有一個(gè)地方操作改數(shù)據(jù)。


運(yùn)行上面的程序,就能得到理想的輸出了:



運(yùn)行中啟動(dòng)線程

前面演示的程序,都是在主線程中,啟動(dòng)了子線程,然后并行運(yùn)行。


在實(shí)際使用中,還可以在主線程中,按需啟動(dòng)子線程。

我們先看下面的程序:

# file: multicore_test06.py
import machine
import _thread
import utime


def run_on_core1():
print("[core1] run thread")
utime.sleep_ms(100)


def run_on_core0():
while True:
print("[core0] start thread:")
_thread.start_new_thread(run_on_core1, ( ))
utime.sleep_ms(1000)

run_on_core0()

(左右移動(dòng)查看全部?jī)?nèi)容)


在上面的程序中,core0上運(yùn)行的主線程,會(huì)每過(guò)1秒啟動(dòng)一個(gè)子線程。子線程在core1上運(yùn)行完以后,會(huì)自動(dòng)退出。


運(yùn)行后,輸出如下:



需要特別注意的是,如果子線程還沒(méi)有退出,那么再次啟動(dòng),將會(huì)出現(xiàn)錯(cuò)誤。


例如我們修改上面的程序的延時(shí)如下:

# file: multicore_test07.py
import machine
import _thread
import utime


def run_on_core1():
print("[core1] run thread")
utime.sleep_ms(1000)


def run_on_core0():
while True:
print("[core0] start thread:")
_thread.start_new_thread(run_on_core1, ( ))
utime.sleep_ms(100)

run_on_core0()

(左右移動(dòng)查看全部?jī)?nèi)容)


運(yùn)行后,就會(huì)出錯(cuò):

[core0] start thread:
[core1] run thread
[core0] start thread:
Traceback (most recent call last):
File "", line 17, in
File "", line 14, in run_on_core0
OSError: core1 in use


其原因就在于,子線程還沒(méi)有結(jié)束,主線程又再次啟動(dòng)主線程了。


這在多線程編程中,是需要特別注意的問(wèn)題。


要解決這個(gè)問(wèn)題,可以使用前面主線程和子線程交互中的方法,例如使用一個(gè)全局變量表示子線程是否運(yùn)行完成,或者使用鎖。


下面是一個(gè)使用鎖的程序:

# file: multicore_test08.py
import machine
import _thread
import utime


def run_on_core1():
lock.acquire()
print("[core1] run thread")
utime.sleep_ms(1000)
lock.release()


def run_on_core0():
while True:
print("[core0] start thread:")
lock.acquire()
_thread.start_new_thread(run_on_core1, ( ))
lock.release()
utime.sleep_ms(100)


lock = _thread.allocate_lock()
run_on_core0()

(左右移動(dòng)查看全部?jī)?nèi)容)


運(yùn)行后,輸出如下:

[core0] start thread:
[core1] run thread
[core0] start thread:
[core1] run thread
[core0] start thread:
[core1] run thread
[core0] start thread:
[core1] run thread



多線程的實(shí)例


雙線程做pwm和ws2812b

下面,再用一段稍微復(fù)雜一點(diǎn)點(diǎn)的程序,演示多線程的使用。

# file: multicore_test09.py
import machine
import _thread
import utime
from ws2812 import WS2812


led = machine.Pin(25, machine.Pin.OUT)
led.off()


BLACK = (0, 0, 0)
RED = (255, 0, 0)
YELLOW = (255, 150, 0)
GREEN = (0, 255, 0)
CYAN = (0, 255, 255)
BLUE = (0, 0, 255)
PURPLE = (180, 0, 255)
WHITE = (255, 255, 255)
COLORS = (BLACK, RED, YELLOW, GREEN, CYAN, BLUE, PURPLE, WHITE)


ws = WS2812(3, 1) #WS2812(pin_num,led_count)
ws.pixels_fill(BLACK)
ws.pixels_show()


def run_on_core1():
while True:
for color in COLORS:
ws.pixels_fill(color)
ws.pixels_show()
utime.sleep_ms(200)

def run_on_core0():
duty = 0
step = 1
count = 0
while True:
led.on()
utime.sleep_ms(duty)
led.off()
utime.sleep_ms(10-duty)

count = count + 1
if count>10:
count = 0
duty = duty + step
if duty >= 10:
step = -1
if duty <= 0 :
step = 1


_thread.start_new_thread(run_on_core1, ( ))
run_on_core0()

(左右移動(dòng)查看全部?jī)?nèi)容)


在上面的這段程序中,我們會(huì)在core0上運(yùn)行的主線程中,控制GPIO25的輸出占空比,從而讓板載LED產(chǎn)生類(lèi)似呼吸燈的效果。同時(shí),還會(huì)在core1上運(yùn)行的子線程中,控制板載WS2812B燈珠變色。


雙線程播放Bad Apple

最后,我們?cè)儆媒?jīng)典的Bad Apple,作為這篇文章的結(jié)尾。

# file: multicore_test10.py
from machine import SPI,Pin
from ssd1306 import SSD1306_SPI
import framebuf
import _thread
import utime


spi = SPI(1, 100000, mosi=Pin(11), sck=Pin(10))
display = SSD1306_SPI(128, 64, spi, Pin(9),Pin(8), Pin(1))


def run_on_core1():
global fbuf
while True:
if not fbuf == None:
display.fill(0)

lock.acquire()
display.blit(fbuf,19,0)
fbuf = None
lock.release()

display.show()


utime.sleep_ms(100)


def run_on_core0():
global fbuf
while True:
for i in range(1,139):
dirt = 'BAD_APPLE/' + str(i) + '.pbm'
print(i, dirt)
with open(dirt,'rb') as f :
f.readline()
f.readline()
data = bytearray(f.read())

lock.acquire()
fbuf = framebuf.FrameBuffer(data,88,64,framebuf.MONO_HLSB)
lock.release()

utime.sleep_ms(100)


fbuf = None
lock = _thread.allocate_lock()
_thread.start_new_thread(run_on_core1, ( ))
run_on_core0()

(左右移動(dòng)查看全部?jī)?nèi)容)


上面的代碼,使用core0上運(yùn)行的主線程,來(lái)從pbm文件中讀取需要呈現(xiàn)的圖片數(shù)據(jù),而在core1上運(yùn)行的子線程中,則使用讀取到的數(shù)據(jù)輸出到OLED進(jìn)行顯示。


因?yàn)槭芟抻赑ico內(nèi)置存儲(chǔ)的限制,并沒(méi)有存儲(chǔ)完整的Bad Apple數(shù)據(jù),所以只播放了部分。如果感興趣,可以將數(shù)據(jù)放置到SD卡上,主線程讀取數(shù)據(jù),子線程顯示數(shù)據(jù),一樣絲滑流暢。



后記


多線程是個(gè)讓人有愛(ài)又恨的東西,用好了能有大作用,但是用不好可能會(huì)出現(xiàn)莫名其妙的問(wèn)題,需要好好鉆研。本文只是一些較為基礎(chǔ)的研究,還比較淺顯,對(duì)于gc等方面,都尚未涉及,感興趣的讀者可以進(jìn)一步深入了解。


在鉆研的過(guò)程中,參考了不少資料,對(duì)所有資料的貢獻(xiàn)者表示感謝。以下為參考到的部分資料列表:

  • 樹(shù)莓派Pico迷你開(kāi)發(fā)板MicroPython多線程編程實(shí)踐

  • Multithreaded on Raspberry Pi Pico (MicroPython)

  • Raspberry Pi Pico Dual Core Programming

  • Multi Thread Coding on the Raspberry Pi Pico in Micropython

  • pico-micropython-examples

  • Raspberrypi Pico MicroPython Cookbook

  • MicroPython類(lèi)庫(kù) ? _thread --- 線程

  • ESP32上驅(qū)動(dòng)OLED屏幕播放你想要的視頻



聲明本文由電子發(fā)燒友社區(qū)發(fā)布,轉(zhuǎn)載請(qǐng)注明以上來(lái)源。如需社區(qū)合作及入群交流,請(qǐng)?zhí)砑游⑿臙EFans0806,或者發(fā)郵箱liuyong@huaqiu.com。


更多熱點(diǎn)文章閱讀

  • 龍芯架構(gòu)首款面向嵌入式應(yīng)用的開(kāi)發(fā)板,2K500開(kāi)發(fā)應(yīng)用實(shí)例

  • 基于32位RISC-V設(shè)計(jì)的互聯(lián)型微控制器,沁恒微CH32V307開(kāi)發(fā)樣例

  • RK3568!四核64位ARMv8.2A架構(gòu),匯聚編譯源碼及實(shí)戰(zhàn)樣例

  • 尺寸僅有21mm*51mm,板邊采用郵票孔設(shè)計(jì),合宙 Air105 核心板開(kāi)發(fā)總結(jié)

  • 基于32位RISC-V高集成SoC,ADP-Corvette-T1開(kāi)發(fā)板樣例及源碼!


原文標(biāo)題:【試用報(bào)告】RP2040上的MicroPython環(huán)境中多線程編程

文章出處:【微信公眾號(hào):電子發(fā)燒友論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴

原文標(biāo)題:【試用報(bào)告】RP2040上的MicroPython環(huán)境中多線程編程

文章出處:【微信號(hào):gh_9b9470648b3c,微信公眾號(hào):電子發(fā)燒友論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    RP2040的工業(yè)級(jí)封裝系統(tǒng)!

    這款采用RP2040的工業(yè)級(jí)SiP可實(shí)現(xiàn)無(wú)縫網(wǎng)絡(luò)加速和安全物聯(lián)網(wǎng)連接。WIZnet將W5500以太網(wǎng)控制器與RP2040集成到單個(gè)封裝系統(tǒng),增強(qiáng)了其設(shè)備功能,提供了更全面的網(wǎng)絡(luò)卸載解決方案,為客戶
    的頭像 發(fā)表于 07-06 08:34 ?240次閱讀
    <b class='flag-5'>RP2040</b>的工業(yè)級(jí)封裝系統(tǒng)!

    【干貨分享】RP2040 + Cyclone 10 FPGA PCB 設(shè)計(jì)

    + HQ-Online(華秋商城)下 PCBA 訂單 硬件電(冒煙)測(cè)試與注意事項(xiàng) RP2040 GPIO測(cè)試 (LED閃爍) RP2040 ADC + PWM 示例 Cyclone 10 FPGA
    發(fā)表于 06-12 16:33

    基于XIAO RP2040和樹(shù)莓派的圍棋棋盤(pán)游戲系統(tǒng)設(shè)計(jì)

    今天小編給大家?guī)?lái)的是來(lái)自mocketech的基于樹(shù)莓派和XIAO RP2040的圍棋棋盤(pán)娛樂(lè)系統(tǒng),每塊圍棋石都會(huì)根據(jù)其狀態(tài)顯示面部表情,從而便于評(píng)估整體比賽情況。即使是不熟悉圍棋規(guī)則的人也可以通過(guò)這些表情輕松理解游戲。 靈感
    的頭像 發(fā)表于 04-29 14:01 ?323次閱讀
    基于XIAO <b class='flag-5'>RP2040</b>和樹(shù)莓派的圍棋棋盤(pán)游戲系統(tǒng)設(shè)計(jì)

    RP2350 現(xiàn)已上市!變體即將發(fā)布!

    去年夏天,樹(shù)莓派推出了第二代微控制器平臺(tái)RP2350,它建立在RP2040的成功基礎(chǔ),旨在以類(lèi)似的實(shí)惠價(jià)格提供更高性能。RP2350首次出現(xiàn)在樹(shù)莓派售價(jià)5美元的RaspberryPi
    的頭像 發(fā)表于 03-25 09:20 ?622次閱讀
    <b class='flag-5'>RP</b>2350 現(xiàn)已上市!變體即將發(fā)布!

    矽遞科技XIAO RP2040開(kāi)發(fā)板的Arduino開(kāi)發(fā)環(huán)境配置教程

    在嵌入式系統(tǒng)與物聯(lián)網(wǎng)技術(shù)的推動(dòng)下,開(kāi)發(fā)者亟需兼具性能與便攜的開(kāi)發(fā)工具。2023年,矽遞科技以樹(shù)莓派RP2040芯片為核心,推出 XIAO RP2040 開(kāi)發(fā)板,延續(xù)其標(biāo)志性“拇指尺寸”設(shè)計(jì)(僅20mm×17.5mm),卻突破性地集成雙核處理器與豐富接口,成為微型開(kāi)發(fā)領(lǐng)域重
    的頭像 發(fā)表于 03-17 10:02 ?2074次閱讀
    矽遞科技XIAO <b class='flag-5'>RP2040</b>開(kāi)發(fā)板的Arduino開(kāi)發(fā)<b class='flag-5'>環(huán)境</b>配置教程

    開(kāi)源項(xiàng)目!基于 RP2040 自制一個(gè)”空心時(shí)鐘”

    ,基于 RP2040 微控制器的晶體振蕩器,時(shí)鐘的準(zhǔn)確度也實(shí)現(xiàn)了質(zhì)的飛躍。 沿襲前代模型,我們保留了便捷的時(shí)間調(diào)整方式——只需輕輕拉出顯示環(huán)進(jìn)行調(diào)整,再將其插回底座即可。而此次升級(jí),顯示環(huán)的固定方式更為
    發(fā)表于 02-24 10:19

    RP2350與RP2040全面對(duì)比

    惠的價(jià)格,購(gòu)買(mǎi)時(shí)搭配額外的傳感器、模塊等周邊組件,也會(huì)影響最終的采購(gòu)成本。開(kāi)發(fā)工具差異開(kāi)發(fā)環(huán)境:兩者都支持多種開(kāi)發(fā)環(huán)境,為開(kāi)發(fā)者提供了豐富的選擇。RP2040 支持 MicroPython
    的頭像 發(fā)表于 02-07 19:19 ?2612次閱讀

    RP2350 數(shù)據(jù)手冊(cè)及深度了解功能性能特性和開(kāi)源項(xiàng)目案例

    Raspberry Pi RP2350 是 Raspberry Pi 推出的新一代微控制器,它在上一代 RP2040的基礎(chǔ)上進(jìn)行了重大改進(jìn)。本文將深入探討 RP2350 的功能特性、與 RP2
    的頭像 發(fā)表于 12-27 15:10 ?6750次閱讀
    <b class='flag-5'>RP</b>2350 數(shù)據(jù)手冊(cè)及深度了解功能性能特性和開(kāi)源項(xiàng)目案例

    socket 多線程編程實(shí)現(xiàn)方法

    在現(xiàn)代網(wǎng)絡(luò)編程多線程技術(shù)被廣泛應(yīng)用于提高服務(wù)器的并發(fā)處理能力。Socket編程是網(wǎng)絡(luò)通信的基礎(chǔ),而將多線程技術(shù)應(yīng)用于Socket
    的頭像 發(fā)表于 11-12 14:16 ?1006次閱讀

    Python多線程和多進(jìn)程的區(qū)別

    Python作為一種高級(jí)編程語(yǔ)言,提供了多種并發(fā)編程的方式,其中多線程與多進(jìn)程是最常見(jiàn)的兩種方式之一。在本文中,我們將探討Python多線程
    的頭像 發(fā)表于 10-23 11:48 ?1017次閱讀
    Python<b class='flag-5'>中</b><b class='flag-5'>多線程</b>和多進(jìn)程的區(qū)別

    我用了3分鐘,從零實(shí)現(xiàn)了單片機(jī)的點(diǎn)燈開(kāi)發(fā)!

    近日,小熊派悄悄的上線了一款新的Pico板,基于樹(shù)莓派RP2040芯片的:BearPi-Pico RP2040 樹(shù)莓派? 對(duì),你沒(méi)看錯(cuò)!樹(shù)莓派不僅是一家優(yōu)秀的開(kāi)源硬件品牌,更是一家優(yōu)秀的芯片公司
    發(fā)表于 09-27 15:51

    龍芯2K0300蜂鳥(niǎo)板試用報(bào)告

    龍芯2K0300蜂鳥(niǎo)板試用報(bào)告 一、試用環(huán)境 操作系統(tǒng)和框架:Linux+QT5.15 交叉編譯工具鏈
    發(fā)表于 09-13 18:00

    PLC系統(tǒng)的背板電源保護(hù)應(yīng)用報(bào)告

    電子發(fā)燒友網(wǎng)站提供《PLC系統(tǒng)的背板電源保護(hù)應(yīng)用報(bào)告.pdf》資料免費(fèi)下載
    發(fā)表于 09-13 09:10 ?0次下載
    PLC系統(tǒng)<b class='flag-5'>中</b>的背板電源保護(hù)應(yīng)<b class='flag-5'>用報(bào)告</b>

    ubuntu上交叉編譯rp2040

    連接到rp2040 ,所以使用另一塊pico作為調(diào)試器,需要給pico調(diào)試器下載固件,也就是picoprobe 地址 https://github.com/Wiz-IO
    發(fā)表于 08-27 08:00

    樹(shù)莓派Pico 2發(fā)布,搭載RP2350雙核RISC-V和Arm Cortex-M33微控制器!

    RP2040 一樣輕松超頻到 250MHz 官方聲稱 RP2350 與 RP2040 在軟件和硬件都是向前兼容的(RP2350 兼容
    發(fā)表于 08-13 10:07