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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
9 z# M/ y7 b/ T5 a7 h
+ J3 c- C' g' o0 h9 [2 xOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>0 X, [( q- M, E
#include <unistd.h>/ I, X5 q4 M. C' d5 C: G# }
#include <sys/mman.h>
7 v: p9 V6 L- E6 G#include <sys/types.h>
  J* L, }* R; q# h" g! q#include <fcntl.h>
2 O$ x( \, ]1 P
1 a$ X2 |2 F9 b5 i#define SHAER_RAM_BASE_ADDR    (0x80000000)   ! }8 R( k* e/ k6 A6 h5 `2 a
4 m) T$ n9 v, T' @
typedef struct' N- B% h# }; p; R
{
. j* r, y) @- O. E        unsigned int a;
3 e/ O' O. N5 [& `& X  k        unsigned int b;+ O8 X8 X$ n# m/ t. z
        unsigned int packet_cout;3 C0 S& s* c2 a5 r* u" M
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;$ h( P, B/ |7 E/ l4 ^/ L

* z8 L/ G8 C2 rvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
8 N2 W; k: D" [; cunsigned int count_copy = 0;
4 O, j- O0 x# S1 [" W! H: r+ F
9 `( x. B8 X8 H0 c; H- T
9 h" W& ^( E: p4 l6 ]1 h3 Kint main()5 x) D# x/ o4 P
{
# I6 E% v1 x1 `, E: R        pRX_MSG_PROTOCOL pshreRAM = NULL;0 E0 U5 Q" z8 r$ k& P3 w" v
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;' [9 f4 s. u3 c
/ ^9 c0 j0 Z  @& f* g
        while(1), p( O: ?$ x9 u, n+ z6 d0 J" K
        {5 D/ J: y! h, B$ J/ F( Q/ O3 u
                read_MSG_buffer(pshreRAM);  G* T$ K- \) r. q9 I- A& X! {
        }               
) R" s3 ], e7 C. k& S3 {9 y0 F8 ?}; d) ]0 Z- O8 Q3 e  k
5 {2 _( W5 @7 R1 a( P6 @
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM); X7 \' c* T1 v8 @# @4 h: k& s9 s
{- S4 L( t$ Y- Q+ X9 D7 k0 q
        RX_MSG_PROTOCOL buf;
# Z2 P2 U# d9 ]        
& `9 ?0 E' b* a' C        buf.a = pshreRAM->a;
$ x3 s& U% r/ c# T2 W2 x        buf.b = pshreRAM->b;
' j% Y' O  M$ D* ?7 y' ?        buf.packet_cout = pshreRAM->packet_cout;
" d% J$ m6 t: R          d" X$ M. i, m6 T1 Q  h
        if(buf.packet_cout != count_copy)0 E8 [& u/ {9 C/ S* B4 I' B
        {- `) d6 C$ L3 h; e2 h9 G  a
                printf("a is %d\n", buf.a);
0 m* N- K* \# U$ Y5 A! N                printf("b is %d\n", buf.b);6 @6 V5 l7 h  ~3 \8 ^" M
                printf("count is %d\n", buf.packet_cout);$ S3 o$ {7 R( q+ F1 n- E8 C: p# K5 z
                count_copy = buf.packet_cout;
  D- X+ ?. s# B! ~        }
* w  P& r4 @: T        else( |7 x2 f4 e  _
        {+ ^! D9 a" f6 I: [; T/ ]3 P$ V9 |  f3 w
                printf("No effective message!");/ a, m7 k2 a5 B( i. D, K# J  k& V$ \
        }
) P+ ~6 ]( \4 L1 _& }}7 e7 s$ A6 y5 Y, ]* D

- r8 x6 a  k) y$ t7 h
/ ~" @3 {1 I2 k) L1 d  P" U! b" \但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
1 S" P# G$ ]5 ^5 _7 @5 M  C0 U$ D使用下面代码,对内存使用了mmap函数后:
/ ]' G3 O3 @; b% Q#include <stdio.h>
6 V% ?: Y4 D4 Z) P0 r! k#include <unistd.h>
7 t: e. \% a- y% l#include <sys/mman.h>
9 g1 b9 l  J$ }1 M2 q6 R" L$ D' j! w% Y#include <sys/types.h>6 G) z$ L7 p1 W" D% j
#include <fcntl.h>: a4 _4 i) O) p% W  {6 E

: g5 I. j# J) V) h: T" |$ W#define SHAER_RAM_BASE_ADDR    (0x80000000)
/ Q, X8 ?2 W# e' u/ U3 u#define SHAER_RAM_SIZE         (0x20000)   ' v: b) N) Q  C$ K1 N- o% ]

; H( E" B) ]. |* R! }2 r& u2 J1 B9 p; Btypedef struct2 R6 B' h( K' W" e- q/ l0 e
{
4 v9 ~0 L) v/ Z- {        unsigned int a;
8 N6 F! `+ T4 ]0 A# V        unsigned int b;
6 }! `  K9 w; f        unsigned int packet_cout;
( ]( N. Q  U( l6 k4 L}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;5 L/ Y3 F! w! U  e

5 _: Z( b, m, ovoid read_MSG_buffer(int *baseaddr);0 J: o; i; Z. p: x5 v  u
unsigned int count_copy = 0;
: L$ r: D4 e' X3 t1 F: e) E- |& k9 y
int main()0 \3 _6 {$ A' I4 b
{$ M& o# ^7 v2 \/ L& q- ?6 _& `7 L
        int fd;
4 A  c9 M+ _" Z3 S$ h; n2 {. ?) x        int *mem = NULL;' c( k' N- P# Q/ R+ {+ _6 B% c5 C

- v$ W2 _6 h' S  _2 U6 G        if((fd = open("/dev/mem", O_RDWR)) <0): C# h+ n$ g4 M! C
        {( L( i: ~2 \# T+ l- x6 O: k( g1 u: }; q6 ^
                perror("open error");) E! e1 e% c( \1 C6 A
                return -1;
& @: }0 Y0 G! D2 O% w( M1 Q% a% ]        }. z0 ?# m( u" p) R  [1 s2 s  T$ F
        
8 l1 B7 u- I0 Z9 G- x/ a, ^3 c$ D        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);1 d: l3 g( E5 e: p' |" V+ R; X
) ]- v& V. ]2 F8 M. _. T9 {7 H
        while(1)
* `0 r3 k3 K" E0 k$ j( C& e9 w        {% K0 u- C' }; z5 g
                read_MSG_buffer(mem);0 _& Q# Z7 n1 \( d( }, y
        }                  I" Z; j4 b. T' Y7 [. k) L
}& J) k4 G, R, ~% h# n

  p! L5 ]% g4 ~# x4 K/ A1 h0 Dvoid read_MSG_buffer(int *baseaddr)" I6 i: r8 K7 n; {9 @
{9 H* x7 q" p& {( O
        pRX_MSG_PROTOCOL pshreRAM = NULL;
+ G  V& H; O1 v: t
+ {! j- H# [& w7 e; }6 D1 B        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;+ _" X* V( m3 y

$ G1 o$ ]- p7 n; w1 Y2 t0 I7 Y        if(pshreRAM->packet_cout != count_copy)
, w7 v+ _/ U& @1 W- m        {9 s$ I8 {# Z  S+ U0 F1 O) ~  X
                printf("a is %d\n", pshreRAM->a);
- ~2 x0 T' B' p. [4 s7 m                printf("b is %d\n", pshreRAM->b);7 [. F( P( a. ?& n% T/ }& g, D
                printf("count is %d\n", pshreRAM->packet_cout);: e) a1 n$ }) R- l& t
                count_copy = pshreRAM->packet_cout;
4 P7 `+ r( U5 g$ C4 w. V2 N        }
0 p5 R- R5 k8 A" }, @8 I/ K) r        else9 k& i! j" T5 U
        {6 r2 ]7 U: S; R; L
                printf("No effective message!\n");
7 h! A+ A- _0 e) v. Y5 d3 u/ n        }
) Z" H/ _7 a( m( P  [1 u}* ~' d! @4 N4 q/ W! I
0 D! ^/ W# Y" g* }& A
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???- S9 M* ?7 E( _: I% {

4 |, @5 ^- a, p, M/ w* N9 R% y8 b; I" r- n& p; p, \* q0 O
8 q* j( d7 Z" }. B- Z! }/ X$ J
  {/ E0 n3 w3 j
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-20 10:37 , Processed in 0.040423 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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