遥控器 ota_OTA。 到TGA提取器

遥控器 ota

您会记住OTA格式吗? 您可以作为SMS消息发送的简单图形格式吗? 无论如何,我在手机上找到了很酷的OTA图片,并想将其提取为“正常”图形格式,然后将其添加到

T恤衫 (它还会将图像以多个“#”写出到stdout中)

#ota2tga 
def writetga(width,height,data,filename):
 f = open(filename,"wb")
 file = ""
 file+="%c%c%c" % (0,0,2)
 file+="%c%c%c%c%c" % (0,0,0,0,0)
 file+="%c%c%c%c" % (0,0,0,0)
 file+="%c%c" % ((width & 0x00ff)%0xff,(width & 0xff00)%0xff)
 file+="%c%c" % ((height & 0x00ff)%0xff,(height & 0xff00)%0xff)
 file+="%c%c" % (0x18,0x0)
 for i in range(height):
  for j in range(width):
   file+="%c%c%c" % (data[j+(height-1-i)*(width-1)][0],data[j+(height-1-i)*(width-1)][1],data[j+(height-1-i)*(width-1)][2])
 f.write(file)
 f.close() 
# add the name of your .ota file here.
f = open("Grafikkmelding.ota","rb")
info = ord(f.read(1))
width = ord(f.read(1))
height = ord(f.read(1))
color = ord(f.read(1)) 
pixmap = [[255,255,255]]*(72*28)
print width
print height
x = 0
y = 0
l = ""
for i in range(height):
 for j in range(width / 8):
  v = ord(f.read(1))
  for k in range(8):
   if( ((v >> 7-k) & 0x01) == 0):
    l+=" "
    pixmap[x+y*width] = [255,255,255]
   else:
    l+="#"
    pixmap[x+y*width] = [0,0,0]
   x+=1
   if(x > width):
    x=0
    y+=1
 l+="\n"   
f.close()
print l
writetga(width,height,pixmap,"output.tga") 
-荣誉

翻译自: https://bytes.com/topic/python/insights/872877-ota-tga-extractor

遥控器 ota

<think> 我们正在讨论ESP-IDF中的OTA(空中升级)机制,特别是`esp_ota_begin`函数使用`OTA_WITH_SEQUENTIAL_WRITES`模式的情况。根据引用[1],`OTA_WITH_SEQUENTIAL_WRITES`被定义为`0xfffffffe`,用于当新镜像大小未知且擦除可以以增量方式完成时(假设写操作是连续的顺序写入)。 关键点: 1. 当使用`OTA_WITH_SEQUENTIAL_WRITES`时,`erase_size`参数设置为该值,表示我们不知道新镜像的确切大小,并且擦除操作将在后续的写入过程中逐步进行(按顺序写入)。 2. 引用[3]展示了`esp_ota_begin`的调用方式:`esp_ota_begin(handle->update_partition, erase_size, &handle->update_handle);`,其中`erase_size`就是`OTA_WITH_SEQUENTIAL_WRITES`。 3. 引用[4]指出,当使用`OTA_WITH_SEQUENTIAL_WRITES`时,不会执行`esp_partition_erase_range`函数,因为擦除操作将在后续写入过程中逐步完成。 使用注意事项: - 这种模式适用于镜像大小未知的情况,例如通过流式传输接收固件。 - 写入操作必须是连续的,不能跳过某些区域(即必须按顺序写入)。 - 在调用`esp_ota_begin`后,通过多次调用`esp_ota_write`来写入数据,最后调用`esp_ota_end`来结束升级过程。 - 使用此模式时,分区不会在开始时被完全擦除,而是在写入每个扇区之前擦除该扇区(或按需擦除)。 示例代码框架: 以下是使用`OTA_WITH_SEQUENTIAL_WRITES`模式进行OTA更新的基本代码结构: ```c #include "esp_ota_ops.h" #include "esp_log.h" static const char *TAG = "OTA_EXAMPLE"; void ota_update_sequential(esp_partition_t *update_partition) { esp_ota_handle_t update_handle = 0; esp_err_t err; // 开始OTA更新,使用OTA_WITH_SEQUENTIAL_WRITES模式 err = esp_ota_begin(update_partition, OTA_WITH_SEQUENTIAL_WRITES, &update_handle); if (err != ESP_OK) { ESP_LOGE(TAG, "esp_ota_begin failed: %s", esp_err_to_name(err)); return; } // 假设我们有一个数据源(例如网络套接字),通过循环读取数据并写入 uint8_t data_buffer[1024]; size_t data_read; while (1) { // 从某个源读取数据(例如网络) data_read = read_data_from_source(data_buffer, sizeof(data_buffer)); if (data_read == 0) { break; // 读取结束 } // 写入数据到OTA分区 err = esp_ota_write(update_handle, data_buffer, data_read); if (err != ESP_OK) { ESP_LOGE(TAG, "esp_ota_write failed: %s", esp_err_to_name(err)); break; } } // 结束OTA更新 if (err == ESP_OK) { err = esp_ota_end(update_handle); if (err != ESP_OK) { ESP_LOGE(TAG, "esp_ota_end failed: %s", esp_err_to_name(err)); } else { ESP_LOGI(TAG, "OTA update completed successfully"); // 在这里可以设置新分区为下一次启动的分区,并重启 esp_ota_set_boot_partition(update_partition); esp_restart(); } } else { // 如果中途出错,取消OTA操作 esp_ota_abort(update_handle); ESP_LOGE(TAG, "OTA update aborted"); } } ``` 注意事项: - 在写入过程中,每次调用`esp_ota_write`都会确保写入的数据在闪存上连续存储。由于闪存需要先擦除再写入,因此内部会在需要时擦除扇区。 - 使用此模式时,写入的数据量不能超过目标分区的大小(否则会返回错误)。 - 在写入结束后,必须调用`esp_ota_end`来验证镜像的完整性(包括检查校验和等)。如果镜像无效,则`esp_ota_end`会返回错误。 - 如果升级过程被中断(例如设备断电),则分区可能处于不一致状态。因此,建议在升级过程中使用额外的机制(如状态标记)来恢复。 引用说明: 根据引用[4],当使用`OTA_WITH_SEQUENTIAL_WRITES`时,不会在开始时擦除整个分区,而是在写入过程中逐步擦除。这样可以避免在镜像大小未知时需要预先擦除整个分区(可能很大)的开销和等待时间[^4]。 相关问题: 1. 使用`OTA_WITH_SEQUENTIAL_WRITES`模式时,如何保证升级过程断电安全? 2. `esp_ota_write`函数在顺序写入时如何处理闪存擦除操作? 3. 如何设置分区以在OTA更新后启动新固件? </think> ### `esp_ota_begin`函数使用`OTA_WITH_SEQUENTIAL_WRITES`模式详解 #### 1. **模式定义与用途** `OTA_WITH_SEQUENTIAL_WRITES`是ESP-IDF OTA机制中的特殊擦除模式常量,定义如下: ```c #define OTA_WITH_SEQUENTIAL_WRITES 0xfffffffe ``` **核心用途**:当新固件镜像大小未知时,启用**增量式擦除**机制。适用于流式传输固件的场景(如网络OTA),允许按顺序写入数据,无需预先擦除整个分区[^1]。 #### 2. **工作原理** - **擦除策略**: 当`erase_size`参数设为`OTA_WITH_SEQUENTIAL_WRITES`时,不会立即擦除整个分区。固件写入过程中,系统在每次写入操作前**自动擦除所需的最小闪存扇区**(通常4KB)。 如引用[4]所述:`esp_partition_erase_range`函数不会被触发[^4]。 - **写入要求**: 数据必须按**严格连续的顺序**写入(地址从低到高),禁止随机访问。违反顺序会导致操作失败。 #### 3. **使用示例** ```c #include "esp_ota_ops.h" void ota_update() { esp_ota_handle_t update_handle; esp_partition_t *update_partition = esp_ota_get_next_update_partition(NULL); // 启动OTA(未知固件大小,使用顺序写入模式) esp_err_t err = esp_ota_begin( update_partition, OTA_WITH_SEQUENTIAL_WRITES, // 关键参数 &update_handle ); if (err != ESP_OK) { ESP_LOGE("OTA", "Begin failed: %s", esp_err_to_name(err)); return; } // 模拟流式写入(必须连续!) uint8_t data_chunk[1024]; while (data_source_has_data()) { size_t len = read_data_chunk(data_chunk, sizeof(data_chunk)); err = esp_ota_write(update_handle, data_chunk, len); if (err != ESP_OK) break; } // 结束并验证固件 if (err == ESP_OK) err = esp_ota_end(update_handle); if (err == ESP_OK) esp_ota_set_boot_partition(update_partition); } ``` #### 4. **关键注意事项** 1. **分区状态管理**: 若启用`CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE`,需检查分区状态(如`ESP_OTA_IMG_PENDING_VERIFY`)。无效状态会导致`ESP_ERR_OTA_ROLLBACK_INVALID_STATE`错误[^2]。 2. **错误处理**: - 写入不连续时返回`ESP_ERR_INVALID_ARG` - 空间不足时返回`ESP_ERR_OTA_SIZE_TOO_LARGE` - 需检查`esp_ota_end()`的返回值(验证固件完整性) 3. **性能影响**: 频繁的小数据写入会降低效率(因多次擦除)。建议缓存足够数据(≥4KB)再写入以优化性能。 #### 5. **适用场景** - **网络OTA**:通过HTTP/MQTT流式传输固件 - **资源受限设备**:避免预先分配完整固件缓冲区 - **大分区更新**:规避长时间擦除导致的看门狗超时 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值