OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5608|回复: 0
打印 上一主题 下一主题

OMAPL138的内存映射是否在Linux下已经完成???

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 1 N" F; q, H( g+ C
# z' k& F) b8 K: L7 g$ g
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
, C# F4 H: O, ~3 f0 j& Z! B/ J#include <unistd.h>
& R! K! w2 y& P4 W; Q6 Y#include <sys/mman.h>% Z7 a" b6 q& M! {; B
#include <sys/types.h>, D) i& @8 ~! c& u' o: P
#include <fcntl.h>
. y8 K! k* g' F* q6 V/ k" z. [* D1 P0 v- A$ W' S( U
#define SHAER_RAM_BASE_ADDR    (0x80000000)   ! t1 A' L" i& j/ A

  e- [. g3 ?# j1 u& m" Stypedef struct
" w9 a/ @5 W) e# Q9 S" X7 `, P{
7 p1 M) x2 m' @        unsigned int a;: H- y8 r7 ^% G' c
        unsigned int b;
, X( N# G9 t; {        unsigned int packet_cout;: S4 l6 Q2 t$ y% z
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;$ B5 w: `, L9 u6 n
* G. Z4 n: S2 N1 ~
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
6 I  y/ [) L% n4 [unsigned int count_copy = 0;
9 E$ d' |5 z6 R2 \' c8 K9 b5 G' B1 i5 B) s# F' O, `2 u- \
, f$ U6 s) S! U+ J) u
int main()5 d$ X% J, p1 l
{
2 I* S3 l, p: i2 k        pRX_MSG_PROTOCOL pshreRAM = NULL;
$ F7 l  m3 v+ W! N3 c0 r0 T" a        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;8 m' f: A3 N4 I
% _$ U- j/ f# f3 }
        while(1)8 M1 S) v' T5 B( t% e) i, g$ ~
        {7 i7 X5 K7 ^( b1 S
                read_MSG_buffer(pshreRAM);- J* v. \5 I; r$ j6 M; I1 E
        }               
( p4 d" C& B. D0 \. N7 Z}
% r6 W) `. `% B, g' r5 M! q0 d2 U# T& m4 P5 P+ O
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)- T( i! P% J4 D6 ^" v
{# j3 `! Q, E0 N9 Q
        RX_MSG_PROTOCOL buf;2 i- n$ R! l0 G: S3 r! T
        ! q- q4 \( p8 U# e. @+ _7 n2 m
        buf.a = pshreRAM->a;0 E: {: C( q! q. E9 L1 V& G0 D! X9 F
        buf.b = pshreRAM->b;, G5 c; V; k+ \0 R, {
        buf.packet_cout = pshreRAM->packet_cout;& R6 h) Y, U% X5 [
        , I# W9 t3 r; Q$ K( t
        if(buf.packet_cout != count_copy)4 V5 p& _/ e1 A2 s! b+ \
        {& x# Q4 Y  w$ Q
                printf("a is %d\n", buf.a);. L9 d* `$ ~# M# N' [3 n6 h' T$ }- i1 e
                printf("b is %d\n", buf.b);2 l& O& r$ K# v
                printf("count is %d\n", buf.packet_cout);2 W6 Q8 e+ K  v. g% |3 W- H7 e
                count_copy = buf.packet_cout;: L! B3 ?6 s* ?/ Q: S
        }
# O! E8 j. ^' ?5 b% W) `6 |/ p* j        else
4 s8 `; q' x8 X4 \- C        {
4 b$ G# I3 B" X                printf("No effective message!");
- A" r2 b# @# l6 x% i        }
7 p% x" k7 a% R: a}
4 y: w$ f4 Y. b- s- t6 M9 y
9 w7 }% x8 N' i3 B: @( X5 s  c* R" i; m0 M
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
( ^3 x/ z& Z+ d0 ^  X) ~) T使用下面代码,对内存使用了mmap函数后:  ^: e% `& X- r
#include <stdio.h>
, j7 k- D- f* ]# i7 b: l7 F7 u' _#include <unistd.h>
, p! K+ R" x, _4 R- J5 x8 |  _#include <sys/mman.h>
) w' `% n! N# R5 A/ _#include <sys/types.h>
; X# N! g; z% I, U' h! v#include <fcntl.h>1 d( V( v: {) m( I
/ k1 ^$ S, U+ L' S
#define SHAER_RAM_BASE_ADDR    (0x80000000)3 P9 |' t0 }% g* K2 t1 b
#define SHAER_RAM_SIZE         (0x20000)   2 Q+ {$ U3 X1 I& Q2 f1 L
* D& y3 T# ~  Z* w3 G
typedef struct
" j8 x9 j; M# V+ O{' \, d: I* g) T8 O6 p2 m
        unsigned int a;: G4 Y5 y4 t5 ~9 C  `9 F8 w& e
        unsigned int b;
6 \! B; b: P, O1 V# D/ Y8 y/ [2 p        unsigned int packet_cout;
+ f$ ?" a) m+ x+ q7 x: h7 Q}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;, D/ N( V# c2 T9 e. t3 H# O
5 x. @3 w" j- @8 ^9 }$ ?
void read_MSG_buffer(int *baseaddr);1 \8 K& W* X$ [' C/ i
unsigned int count_copy = 0;/ [0 `# s- n5 I
, Q. W; v/ t! R. o5 I- p
int main()
, a% A9 S. f+ U( j$ V{$ k* J) Q; C% b, l
        int fd;
: D' ^( L# K! {2 m        int *mem = NULL;! S3 ?/ Y+ D! X1 T3 O2 n& J# I
4 m( c/ w: z3 t, q0 F
        if((fd = open("/dev/mem", O_RDWR)) <0)1 l$ V: Z9 G6 r
        {! ]# ^/ z% G* |, d8 P2 _$ W4 n
                perror("open error");
6 o; E  m8 d' t5 d! F& j                return -1;
% g& y4 C1 Z) ^        }
" j2 x( y+ t- ]+ ~1 J        
5 n+ Z$ `2 J9 T; h        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
' W3 u3 Y. q+ ~- z
$ Z6 }, |' b- t4 [; k        while(1). s9 I; e) m, _0 |+ S+ |3 E% f. F
        {  C( y) u8 @$ C+ i: _% s4 {
                read_MSG_buffer(mem);, w# A4 B, p8 j1 P. V+ M& _9 y
        }                & J& _+ b+ d; e  G
}
# e" S! Z+ b; P5 E
! O% q; u- G0 Z$ T. m9 ^void read_MSG_buffer(int *baseaddr)
5 ^" _1 K( P- p- w3 \; d; E7 V3 D4 p1 D6 K{4 ?, h( i, Z& P& o) ]7 y4 N- Z
        pRX_MSG_PROTOCOL pshreRAM = NULL;* I' Q- X  U' T- ?# i
7 N: c4 L' U* D. [; D. q
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;$ |' R0 K  P1 r$ F( y% B8 `9 Q8 Q

7 E6 k% R9 s& a. y* w        if(pshreRAM->packet_cout != count_copy)6 d+ @4 ~0 w( }( E2 V
        {. K: l+ k- a6 M: m$ S- }
                printf("a is %d\n", pshreRAM->a);" ^" t. l% v& `9 I. T4 F2 o  ?: _
                printf("b is %d\n", pshreRAM->b);
- n* i$ H6 g( J+ f  s5 ^( d6 e* B% v                printf("count is %d\n", pshreRAM->packet_cout);: r$ ^5 p0 y5 m% _0 k. c
                count_copy = pshreRAM->packet_cout;7 q8 n' Z1 Q$ W" D+ G, j
        }- o/ i* r9 N/ _" D# U6 k- m
        else
; l' y7 n8 N" I) R0 ^        {
  k. S6 e8 i0 W' Z' F                printf("No effective message!\n");
- X5 ^4 R+ E  L: _        }, U. Z$ R0 o* l! C. i, r
}
- ]; k! N" b0 E- Z+ h$ V% l  \- @
7 d) V0 S) j, o! K没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???6 h3 p, L1 D  `! p" z5 y% N

1 @' i  |- g' L: {( T
4 ?' t7 X: g& Q+ b; J. v8 c% W' J4 q) A; c2 d

6 z; S  y/ s) G8 g
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

点击跳转“创龙科技服务通”

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2026-2-3 00:35 , Processed in 0.044139 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表