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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ) u* t; }* g2 G
2 ]/ b& c# e6 v/ W# j8 B. H  ~2 A
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>8 t; w; G, R' {
#include <unistd.h>' ?- p  A) D5 h8 T1 t  H6 L
#include <sys/mman.h>
" ?. `; i+ s4 J& I9 j) r% R#include <sys/types.h>
7 g: I# m9 ~. h#include <fcntl.h>& @" i. g6 I. v+ I" k& \
( d1 t2 _& r" s# f9 }
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
/ h& t" b5 P8 I
' |( O- E% n% r# N  z# ktypedef struct! C& A& V/ E5 U) _1 e
{  Y( d+ `0 u& T$ X- N1 ?
        unsigned int a;4 c5 m' d0 D9 @$ x/ c- `' d
        unsigned int b;
$ k7 H* d  F  e+ s        unsigned int packet_cout;
$ h" I8 E" C, f5 z- K+ F}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ V( a) L0 ], X5 t3 ?' h
7 \  D1 V  g5 H  G8 `* E6 xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
# S+ u  {8 x% h/ M/ runsigned int count_copy = 0;
7 O2 t% H/ B4 k4 [; }
/ b& B, C! Q/ [1 V' L7 z( `/ l8 V# d2 o
int main()
) O' a+ Y: ?6 [  c9 M) q. K/ m{3 C: `$ V  N3 u3 ?
        pRX_MSG_PROTOCOL pshreRAM = NULL;
: {9 N) W, C  t6 @# ]        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
4 _4 x2 R' a1 N8 g& H& @
* w  G! E$ O2 d6 |3 ~9 r1 w) j        while(1)
, Q1 F8 Y& q( e" K" g% i. G        {+ i1 ]% c! h/ O/ T) H3 Q' x6 f
                read_MSG_buffer(pshreRAM);
- A! s( Y7 K' O: d        }                6 r( k7 }! W6 s
}0 o% g: m2 ^5 I; M  H0 k, }/ m

1 F: J+ a/ `5 ?2 Y! y1 gvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)$ {- t4 s9 J6 W
{
$ I# g7 D0 H) P  E. f/ `        RX_MSG_PROTOCOL buf;% _+ ^' B; H9 `8 [$ e
        
6 N3 w7 e+ H3 Q" ?# y7 l/ g        buf.a = pshreRAM->a;
# I+ n  i6 l2 Z/ z( G3 b        buf.b = pshreRAM->b;
& J. P) i. j# \0 l5 D" L        buf.packet_cout = pshreRAM->packet_cout;* l) i: f# _1 D
        
7 E) X1 j' c* T: A        if(buf.packet_cout != count_copy)2 o/ C5 d8 }2 d( ?- p8 |
        {) ~! k/ k" F% n# w
                printf("a is %d\n", buf.a);) r) f$ \; u5 r8 j) b5 H
                printf("b is %d\n", buf.b);
* i: Y; x8 P1 ^( w( u                printf("count is %d\n", buf.packet_cout);
3 L2 d' W. |" x( V1 C; E  O/ A                count_copy = buf.packet_cout;& _8 B; m, N+ V6 e4 r
        }
. b7 t  L5 j! C        else
$ ]6 T* j2 w* ~! @  j5 P        {# p& l, c, `- E+ H% t: y: y
                printf("No effective message!");
! U! G  I; I% P        }
% n+ c# y8 }* h}) q* u  K2 {. x* d* E$ t

) [! W8 l7 x  E$ j2 `/ L/ U; a- v- F. X
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
/ y! T- Z; G8 M使用下面代码,对内存使用了mmap函数后:: Z. i/ A9 i4 @, e6 {8 a
#include <stdio.h>% U; \" G- L* V+ k' P. k; b8 ]) i
#include <unistd.h>& Y- F% i% q4 U& r0 U+ F
#include <sys/mman.h>; K7 O! L8 a; ?5 Z% i# F' t
#include <sys/types.h>
- l  N0 N* K8 M: d+ C$ E1 N#include <fcntl.h>; K; T+ t) m, ]: T  \7 r3 R! _/ T
4 @+ |& h/ Q4 E
#define SHAER_RAM_BASE_ADDR    (0x80000000)
% S  O2 F" u2 P4 {: t#define SHAER_RAM_SIZE         (0x20000)   
- |- h3 O) S1 H4 N4 `) B; E7 u2 {, c* O2 B3 E3 [" z3 G
typedef struct  [. b' ^7 ^' @2 j1 b
{
: `5 U+ ~+ b8 ^8 r        unsigned int a;
) C0 ]9 Z: ^- t# W, ?. @        unsigned int b;
: J( w# }6 {/ H/ w* w        unsigned int packet_cout;
8 v" F# D  G% A% L7 V. X+ Q+ r" |6 I}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;, h9 @+ G4 f4 H+ m) W" j. P7 B" [
7 O' J7 {+ U& i) @' r
void read_MSG_buffer(int *baseaddr);9 J. f. K( D; v$ s1 M
unsigned int count_copy = 0;
8 K' u$ [9 t. C% Z
* u0 a$ D2 ^9 y! A8 nint main()
& s3 f! x( f3 n2 T6 `1 N: u{+ _, j+ v9 j5 J
        int fd;
, o7 r; p2 l' G9 Q( ^+ k: Z        int *mem = NULL;
8 Y8 e/ p  D; r2 Q7 h0 Z/ ?
' [0 y; ^) D) i" k3 p        if((fd = open("/dev/mem", O_RDWR)) <0)
3 h0 Y* ~8 G9 u1 T9 l        {
0 w' M5 j$ D# h4 C/ Y: P' ?                perror("open error");
+ Y+ O6 T: C; s. M- U% c# w                return -1;
# U; Q' X6 p- N* C        }
; y# ~- Z1 R+ ~5 G" K        
2 L/ `: K1 Y: X" N; k( l( r        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);; j% K* A& l- j- a" s/ ~: d
* {, D2 t+ E! m
        while(1)& s1 U8 @- `; S3 B9 ^+ R
        {! J2 u- i, g7 c2 R) \
                read_MSG_buffer(mem);
  \: T# f. B1 E) x: t) P        }               
! d) o4 B$ R3 J0 u# C3 x1 `$ n$ W}8 L6 y+ o6 E! q  ^# B2 X

# t8 ]( K- |- H- cvoid read_MSG_buffer(int *baseaddr)$ A2 Q7 c/ O! Z
{3 P3 Z  v7 W) A, ]( l7 D
        pRX_MSG_PROTOCOL pshreRAM = NULL;7 w1 g) m: [7 _6 T/ m7 o
# u  v% h) ?( s  \
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;2 v9 v6 |; k& i
4 p$ I+ s7 e5 x& V! r( d$ J
        if(pshreRAM->packet_cout != count_copy)
' J+ T& ?# L9 ~, Y) L& ~! C        {
" x0 s! R" J8 I* k$ L: I9 H! ^6 n                printf("a is %d\n", pshreRAM->a);4 o! [, _* C8 k* E& C
                printf("b is %d\n", pshreRAM->b);2 U  ^8 j3 `  z+ J
                printf("count is %d\n", pshreRAM->packet_cout);6 A* i. a5 [3 h' M
                count_copy = pshreRAM->packet_cout;" X# \' Q. c) }8 ?& I3 R" S9 Y
        }
# {/ E/ a& m" _/ q) y/ l* g        else
' |: s0 O+ U$ X7 O2 a: A# M        {1 h" B" T5 f& T/ _
                printf("No effective message!\n");  K5 V7 q8 q7 E! N" n- Z
        }
; r5 q' G8 k1 P5 l/ `2 C2 w9 X1 g}/ ^, m3 ^2 I. |5 C

1 e$ B8 ?: S6 s# [! {2 S没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
  P' Y4 S9 c5 {9 U4 M  g0 |& M; @% j
+ [; E  Y9 s$ U9 q' C- |
' ^' q6 Q# M) r* o; R$ Y

1 M) j) V2 h5 A4 }+ ~
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-22 07:48 , Processed in 0.040944 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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