write写入函数的注意事项

#include <stdint.h>
#include <stdbool.h>
#include <stdio.h>

#define SBL_SUCCESS 0
#define SBL_ERROR 1
#define SBL_CC2650_MAX_BYTES_PER_TRANSFER 254
#define SBL_CC2650_BL_CONFIG_ENABLED_BM 0xFF

// 定义一个结构体来存储数据传输的详情
typedef struct {
uint32_t startAddr;
uint32_t byteCount;
uint32_t startOffset;
bool bExpectAck;
} tTransfer;

// 函数原型声明
uint32_t getBootloaderEnableAddress() {
// 此函数应返回引导加载程序启用地址的值,这里是一个占位实现
return 0x0000FFFF;
}

void setState(uint32_t code, const char *message, …) {
// 该函数应该设置状态并可能打印消息,这里是一个占位实现
va_list args;
va_start(args, message);
vprintf(message, args);
va_end(args);
}

uint32_t cmdDownload(uint32_t address, uint32_t byteCount) {
// 此函数应该发送一个下载命令,这里是一个占位实现
return SBL_SUCCESS;
}

uint32_t readStatus(uint32_t *status) {
// 此函数应读取设备状态,这里是一个占位实现
*status = SBL_SUCCESS;
return SBL_SUCCESS;
}

const char* getCmdStatusString(uint32_t status) {
// 此函数应返回状态字符串,这里是一个占位实现
return “Success”;
}

void setProgress(uint32_t progress) {
// 此函数应设置进度,这里是一个占位实现
printf(“Progress: %d%%\n”, progress);
}

uint32_t cmdSendData(const char* data, uint32_t byteCount) {
// 此函数应发送数据,这里是一个占位实现
return SBL_SUCCESS;
}

uint32_t addressToPage(uint32_t address) {
// 此函数应返回地址所在的页码,这里是一个占位实现
return address / 4096; // 假设页大小为4096字节
}

// 主函数
uint32_t writeFlashRange(uint32_t ui32StartAddress, uint32_t ui32ByteCount, const char *pcData) {
// … 与之前的代码相同 …

// (从这里继续)计算BL配置地址(取决于flash大小)
uint32_t ui32BlCfgAddr = getBootloaderEnableAddress();

// 计算BL配置缓冲区索引
uint32_t ui32BlCfgDataIdx = ui32BlCfgAddr - ui32StartAddress;

// BL配置是否为缓冲区的一部分?
if(ui32BlCfgDataIdx <= ui32ByteCount) {
    if((pcData[ui32BlCfgDataIdx] & 0xFF) != SBL_CC2650_BL_CONFIG_ENABLED_BM) {
        bBlToBeDisabled = true;
        setState(SBL_SUCCESS, "Warning: Bootloader will be disabled.\n");
    }
}

// 如果BL被禁用,则分为两次传输
if(bBlToBeDisabled) {
    // ... 与之前的代码相同 ...
} else {
    // ... 与之前的代码相同 ...
}

// 对每个传输进行循环
for(uint32_t i = 0; i < (bBlToBeDisabled ? 2 : 1); i++) {
    // ... 与之前的代码相同 ...
}

return SBL_SUCCESS;

}

// 主函数的测试
int main() {
char data[500]; // 假设有500个字节的数据
writeFlashRange(0x0000, 500, data);
return 0;
}
在原始代码中,我们可以看到根据特定的条件创建了一个或两个传输。这与引导加载程序(bootloader)配置区域是否被写入有关。

这里是一些关键点和逻辑的详细解释:

Bootloader Configuration Address(引导加载程序配置地址): 这是一个特殊的地址,其中存储了有关引导加载程序的配置信息。在我们的案例中,它通过getBootloaderEnableAddress函数获得。

Check for Bootloader Disabling(检查是否禁用引导加载程序): 代码首先检查是否正在尝试更改引导加载程序的配置。如果是,它将发出警告,因为这通常是一个危险的操作,可能会使设备无法再次启动。

Creating Transfers(创建传输):

如果尝试更改引导加载程序配置(禁用它),代码将创建两个传输:
第一个传输将写入直到引导加载程序配置地址的所有数据(不包括该地址)。
第二个传输将专门用于写入引导加载程序配置地址,且不期望收到确认。
如果不更改引导加载程序配置,代码将创建一个传输,其中包含所有要写入的数据,而不会分开处理引导加载程序配置数据。
这样做的目的是,如果引导加载程序配置正在更改(即,它被禁用),它被视为一个特殊的情况,并且需要单独处理,以避免不必要的错误或问题。它也提供了一种机制,以在不触及引导加载程序配置的情况下安全地写入数据。
段代码的主要目的是检查是否正在尝试修改引导加载程序的配置。让我们一步一步地分解这段代码来理解它的工作原理:

if(ui32BlCfgDataIdx <= ui32ByteCount)
这一行代码首先检查引导加载程序配置数据的索引是否在我们准备写入的数据范围内。换句话说,它检查我们是否正在写入涉及引导加载程序配置地址的数据。

if((pcData[ui32BlCfgDataIdx] & 0xFF) != SBL_CC2650_BL_CONFIG_ENABLED_BM)
如果上面的条件为真,我们进一步检查该特定索引处的数据是否不等于启用引导加载程序的位掩码(SBL_CC2650_BL_CONFIG_ENABLED_BM)。位与操作& 0xFF是为了仅比较字节数据的低8位。

这里的pcData是一个指向字符数组的指针,包含我们准备写入的所有数据,而ui32BlCfgDataIdx是引导加载程序配置数据在这个数组中的索引。

bBlToBeDisabled = true;
如果上述所有条件都为真,这意味着我们正在尝试更改引导加载程序的配置(更具体地说,我们正在尝试禁用它)。因此,我们将bBlToBeDisabled标志设置为true。

setState(SBL_SUCCESS, “Warning: Bootloader will be disabled.\n”);
我们还调用setState函数来发出警告,指出引导加载程序将被禁用,这是一个重要的更改,可能会影响设备的正常操作。

综合上述分析,这段代码的目的是在尝试禁用引导加载程序时发出警告,并据此修改后续的数据传输行为。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值