rt-thread下 <DeviceDrivers> 和 <Drivers> 的区别和作用

Drivers–配置函数–【drv_usart.c】

涉及更多硬件信息,为配置服务

    #define USART3_TX_PIN                    GPIO_PIN_10
    #define USART3_TX_GPIO_PORT              GPIOB
    #define USART3_TX_AF                     GPIO_AF7_USART3
    #define USART3_RX_PIN                    GPIO_PIN_11
    #define USART3_RX_GPIO_PORT              GPIOB
    #define USART3_RX_AF                     GPIO_AF7_USART3

    #define USART3_RX_DMA_CHANNEL            DMA1_Channel3
    #define USART3_RX_DMA_REUQEST            DMA_REQUEST_2
    #define USART3_RX_DMA_IRQN               DMA1_Channel3_IRQn
    #define USART3_RX_DMA_IRQHandler         DMA1_Channel3_IRQHandler

DeviceDrivers–操作函数–【serial.c】

定义device下ops的动作函数,
定义 rt_hw_serial_register,将动作函数加入到设备中。

    device->init        = rt_serial_init;
    device->open        = rt_serial_open;
    device->close       = rt_serial_close;
    device->read        = rt_serial_read;
    device->write       = rt_serial_write;
    device->control     = rt_serial_control;

外部函数列举–串口

  • Drivers
    drv_usart.h
int stm32_hw_usart_init(void);

  • DeviceDrivers
    serial.h
struct rt_serial_device
{
    struct rt_device          parent;

    const struct rt_uart_ops *ops;
    struct serial_configure   config;

    void *serial_rx;
    void *serial_tx;
};
typedef struct rt_serial_device rt_serial_t;

/**
 * uart operators
 */
struct rt_uart_ops
{
    rt_err_t (*configure)(struct rt_serial_device *serial, struct serial_configure *cfg);
    rt_err_t (*control)(struct rt_serial_device *serial, int cmd, void *arg);

    int (*putc)(struct rt_serial_device *serial, char c);
    int (*getc)(struct rt_serial_device *serial);

    rt_size_t (*dma_transmit)(struct rt_serial_device *serial, rt_uint8_t *buf, rt_size_t size, int direction);
};

void rt_hw_serial_isr(struct rt_serial_device *serial, int event);

rt_err_t rt_hw_serial_register(struct rt_serial_device *serial,
                               const char              *name,
                               rt_uint32_t              flag,
                               void                    *data);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这段代码是用来判断一棵二叉树是否为二叉排序树的。首先,它判断当前节点的左右子树是否为空,如果都不为空,就判断当前节点的值是否大于左子树的最大值并且小于右子树的最小值。如果左子树为空而右子树不为空,就判断当前节点的值是否小于右子树的最小值。如果右子树为空而左子树不为空,就判断当前节点的值是否大于左子树的最大值。如果左右子树都为空,则认为当前节点符合条件,返回1。如果当前节点的值不符合条件,返回0。最后,递归判断左右子树是否为二叉排序树,如果有任意一个不是,则返回0。 以下是对代码的改进建议: 1. 函数没有返回值,但是缺少return语句。应该在函数最后添加一个return语句,以避免编译错误。 2. 函数命名不太规范,应该使用更具有表现力的名称,例如isValidBST。 3. 函数参数应该加上const关键字,以避免在函数内部修改参数值。 4. 函数中存在大量重复的代码,可以使用更简洁的方式来实现,例如使用三目运算符替代if-else语句。 5. 函数中没有考虑节点值可以重复的情况,应该加上相等的判断。 下面是改进后的代码: ```cpp bool isValidBST(const TreeNode* root, long long minVal = LONG_LONG_MIN, long long maxVal = LONG_LONG_MAX) { if (!root) { return true; } if (root->val <= minVal || root->val >= maxVal) { return false; } return isValidBST(root->left, minVal, root->val) && isValidBST(root->right, root->val, maxVal); } ``` 在上面的代码中,我们使用了函数重载来简化参数传递。在第一次调用时,我们只传入根节点,而minVal和maxVal则使用默认参数。在递归过程中,我们根据左右子树的情况来更新minVal和maxVal,以确保节点值符合二叉排序树的条件。如果节点值超出了minVal和maxVal的范围,则返回false。最终,如果所有节点都符合条件,则返回true。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值