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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 9 Y( o/ i/ i0 o
( ]" a3 h3 Z; M9 F& m. t! a2 b9 }
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
% F9 S2 x; \4 D6 t/ N! F# P. [#include <unistd.h>
: L% w. b- b1 ~8 x#include <sys/mman.h>
1 x2 n- a( C  S6 c1 A% d#include <sys/types.h>5 j/ ^: S7 x* n" l8 b
#include <fcntl.h>
; ~! j3 _; z' P4 {# H1 U- W0 J; C! W* S" J
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
( d7 z5 B/ Q1 y/ @% k9 z' d# j) ?3 P1 f# W- C
typedef struct
" D9 d# N/ D1 q# f( E{+ b/ d' ]: w' s1 w* D& _
        unsigned int a;
: _2 A9 q  h8 q& Y$ g" v7 h        unsigned int b;
& l! _5 i: ?  E0 R. \/ B        unsigned int packet_cout;- D, e& \% ~  B" G9 ]9 X  N5 ]
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. b& B2 a6 U- Y! @
: x; t1 x7 Z* n* ?% |
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);% j! g& A* _$ }4 _3 h& n
unsigned int count_copy = 0;& p, o1 X( e8 U1 v

) V9 O" |* B/ H$ d- ~$ h1 S- C4 T4 }0 `" H
int main()
+ j5 _5 Y3 L  p* e{
: R' @" U! C: z& E  m- ]4 T        pRX_MSG_PROTOCOL pshreRAM = NULL;
. b0 }7 @$ M% S        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;/ w" S8 n2 @9 r" \* X+ s! f

) P$ e1 @, h- D$ ]6 T2 h5 c& {        while(1)' c- ?$ x  o* w3 L
        {
0 F0 h9 r6 D! n                read_MSG_buffer(pshreRAM);: Z- {8 J0 D& c
        }               
' L+ P1 u" [5 J" O' X! J}
% d$ q/ }# A4 w% K2 _& J4 p) Z
! r* @* V7 d5 k5 vvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
: T. s0 `& n5 ~$ s7 p& ^{, o& @# {8 O7 @* i2 u% q
        RX_MSG_PROTOCOL buf;% Z! m; N: Y8 Q
        & H0 E! E8 m$ _7 V
        buf.a = pshreRAM->a;: P( A/ n4 r6 A0 T; a  K" Z
        buf.b = pshreRAM->b;
& b  T1 I. M8 V! x/ m, ~, u        buf.packet_cout = pshreRAM->packet_cout;
0 `: d: g; n' Y- `& Z0 g7 n" K) N& Z        % @$ e% H3 V% ?  u2 X
        if(buf.packet_cout != count_copy)
0 m' _) ~. M, j7 i7 v        {( l$ a' A; G' x4 U+ H8 `( S
                printf("a is %d\n", buf.a);
' t/ j2 a& O- G                printf("b is %d\n", buf.b);! f: J2 Q9 T1 V  k$ v
                printf("count is %d\n", buf.packet_cout);
! m% C5 c- i4 |                count_copy = buf.packet_cout;
* ]8 Y% E+ R) {" _* b( `- W        }
1 I8 U4 N% u" p        else
( k3 R. n+ H, s& t' v. o: |        {
" o$ S+ L2 u4 ?4 G! y7 g: d8 i1 f                printf("No effective message!");
7 ^+ O* y! f8 l7 s8 W$ Y; x1 W+ b        }
- O( p5 e! C; w$ v}
- n  `' ^, _$ n2 \( F0 M) ~( p! }" e
9 M. I2 V( \& P- O0 g
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
" H9 D- F$ Y- K, X使用下面代码,对内存使用了mmap函数后:7 r; J. k" B" N, q) I/ p1 {
#include <stdio.h>
% [: F7 e2 R+ Q, H, {1 ]#include <unistd.h>
7 Q! D7 Z3 r+ P#include <sys/mman.h>
: h3 }" Z; U0 E7 T$ X#include <sys/types.h># V/ w6 p0 j* a& X$ B1 P$ M
#include <fcntl.h>% K% H* f: k, q+ C
, g5 X/ Z2 _9 |! J
#define SHAER_RAM_BASE_ADDR    (0x80000000)
  m. J. s6 w" G/ _$ x#define SHAER_RAM_SIZE         (0x20000)   
* b/ G2 ?! b& ^& X! [+ @8 _
0 |, f0 S4 ^* e2 O) \  o: q, xtypedef struct
  M- w" I# Q1 y6 d' W) I$ {- h{
/ b3 o8 N; n" s" q/ @        unsigned int a;
5 E- V! p' V; r+ i: c        unsigned int b;# q: l( ~. k: L( E- f
        unsigned int packet_cout;3 x, t3 g; a7 \, h
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: H6 N0 M( c. C5 q; a/ [! A/ U3 u9 F1 [3 J, l( U( Z8 o8 H
void read_MSG_buffer(int *baseaddr);4 q7 \. G6 |. j
unsigned int count_copy = 0;$ T: A  F# x. J; n
! S) R6 r. P6 M+ x1 z' e5 O/ S
int main()) k; k* S1 B7 [9 t3 Q  r
{
9 A+ L+ O7 m; o! A. n  K  S        int fd;
8 e  R! i2 `$ Y  x5 N0 U        int *mem = NULL;
, \" \- ?7 j( T9 u1 h" g" L6 E
0 v6 I$ z  ?# E3 r: {3 \        if((fd = open("/dev/mem", O_RDWR)) <0)1 P/ e- k3 a% z* i9 X
        {7 D2 g8 W! W, M, C& N
                perror("open error");
, B% ]# ?9 A$ Q' O; w3 e                return -1;5 r: E  f0 {+ |. {( E9 d
        }$ ?" A9 b% i4 `* n
        
' d9 n. Z: ^' J. @" h; b/ E  t        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);3 ^& v9 I( M  x" ^
: w. x+ @7 R% c$ a9 A2 ^5 p
        while(1)
% ^& b. u) ?5 k1 I        {: F1 l+ f8 P8 [
                read_MSG_buffer(mem);4 `0 Y- p! c9 T& O, d; \
        }               
" A. ^9 \: G) X}
- R! S) P' H7 G& V. a4 t6 o1 }* f0 n% p, S6 Z, y0 P8 |
void read_MSG_buffer(int *baseaddr)
8 _& q! U# k9 k+ `{; f( i0 `/ D2 s& i9 Q: M' W0 C
        pRX_MSG_PROTOCOL pshreRAM = NULL;
3 h% Z9 b. ]" E, m0 A$ H* ]/ k1 M- m, O2 D; c. C
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;; Z6 A- J9 X- A' d
, C' t3 g3 W3 R+ _# g7 y
        if(pshreRAM->packet_cout != count_copy)
, l; }" a: l& B        {# A2 q, c" K3 B$ V9 b
                printf("a is %d\n", pshreRAM->a);
+ x# M3 s: g7 N) l3 A2 F                printf("b is %d\n", pshreRAM->b);( T" |' F& W& \# z
                printf("count is %d\n", pshreRAM->packet_cout);4 s* @" A8 @$ Q* R
                count_copy = pshreRAM->packet_cout;
# J, Y0 @6 m* V7 n        }
7 W' |+ |. q/ r4 }5 G# u        else
/ N( ^+ g2 M4 _! E        {
  G8 l- g' h  e# e, N5 H, o9 j7 F* f                printf("No effective message!\n");
! S3 m3 n& @2 y! o# ^        }1 H' I3 s$ b; U% S9 D
}0 t# Y0 i3 N) }6 |4 Y0 Z

% I6 ~  l. a4 b; ^% i, [$ c9 Q没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
' g  U9 P) g9 M( ?7 `3 o% ?' u4 ^

* ]/ R% b( X" e7 y6 R" F' A% ^  I5 o1 i  l) [$ r# l
( g- S- A8 o# S2 ^4 M, W
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-10 17:22 , Processed in 0.040931 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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