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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 * t3 T7 |7 O1 Z* l6 S' h0 b* b
  X: }1 d* Q: n% r1 M
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
5 i/ E7 {. z6 G2 x; ^0 I7 B$ d% r1 G#include <unistd.h>; H2 ^- l3 a) J. ~
#include <sys/mman.h>3 j, \6 [4 d$ b# ~" p1 W0 B9 j
#include <sys/types.h>
4 B3 r' E/ ?; r1 N2 g: c0 u. k. q#include <fcntl.h>
+ k* m; ~* \9 ?. |, f. W- s* _' g, n4 g0 c8 U* m
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
8 F& W, B1 [1 [5 N( f/ p$ g( s* x; N3 z2 Q" w/ E/ i7 k# a9 G- y9 _
typedef struct
# x# D* s6 T9 |* w$ P{
: ~" M  I# _% `! t4 M+ k: r/ b        unsigned int a;# _/ r, v7 h" Q. I% L: a
        unsigned int b;3 t: k* u9 A, r4 Q
        unsigned int packet_cout;9 R9 A$ @7 n- X
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 x  A6 d3 s; v/ W0 U0 o" E# v" S3 ^4 R- O8 g: {: b- M1 O
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
. X* p4 Y2 ^. y6 S# |+ ]unsigned int count_copy = 0;
/ ~1 y  \! V5 E, ^& g  {7 y) `- ?3 S# \

8 k  _7 h( L: G6 E, z' jint main()' D0 d+ _' m* o+ p. K' @4 d  C
{
. b) ^' |& a0 v- m/ x0 C: v        pRX_MSG_PROTOCOL pshreRAM = NULL;
/ q0 {' n2 q$ s        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
/ Z0 {$ c! k+ W: C2 N3 r- M' r! l% z
        while(1)3 {4 Y1 E9 d! D: I( i4 x! }
        {
# m7 x. z( n2 @                read_MSG_buffer(pshreRAM);9 S2 y! t8 ]5 L  e4 X
        }                & Q. T: }( L( g$ B8 o1 h( g2 `
}
7 \9 p# X' e$ o7 A7 x( c' |' e0 ?0 u2 T+ w  R& i) e
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)& Y* S# O( J0 d' i7 t+ h- E7 |4 W
{9 Q+ A# }7 R  |( Y* m- e, r$ q: G
        RX_MSG_PROTOCOL buf;
! D( {5 j) I8 P% }% K        % M8 f2 X7 t8 Q4 w0 L
        buf.a = pshreRAM->a;
$ f4 I9 b8 @# W) J1 Z% I        buf.b = pshreRAM->b;
# R: h8 J, M& |        buf.packet_cout = pshreRAM->packet_cout;
% ?0 A. i, x( d+ s9 R$ c/ p        
5 a# P+ t' V, Z& H        if(buf.packet_cout != count_copy)# g0 Y7 Y1 ]3 V$ X7 W4 v1 ^
        {
/ e& Q; j! u9 u! p                printf("a is %d\n", buf.a);  t# N& C' J8 u/ h) o4 f) h
                printf("b is %d\n", buf.b);
3 Q: r$ }! u9 ?5 u                printf("count is %d\n", buf.packet_cout);
/ @! J* @- d( Y- a                count_copy = buf.packet_cout;
- H8 @  w; E5 F        }
! X" T2 ~' v3 R' k        else$ k5 q% ]4 m4 e
        {
" `9 ]5 ]3 Y8 Q                printf("No effective message!");- |. B7 x- N- Y! W; W7 p5 p
        }
5 E  A; n( Z4 ]}3 T, i% D* T; m& d
# D  m% y7 l+ Y  F* |

4 T; |  i) }, R5 u, Y/ l但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
$ i, {; B' i5 _) y% d" ~* a! H& h使用下面代码,对内存使用了mmap函数后:
. r+ ~" K9 E7 Y9 ?) s* O1 b#include <stdio.h>
* O7 w# n3 H: L#include <unistd.h>
: D& k" K) j# r0 j; j5 R- w#include <sys/mman.h>
* p5 W  ?. x3 A9 |. B#include <sys/types.h>2 X9 S" T0 s  l
#include <fcntl.h>
+ w& b2 k' w# c# S. p- ]( `* M, s0 q- z7 z# y, b2 w6 x, O; m
#define SHAER_RAM_BASE_ADDR    (0x80000000)
1 v! |& T- P5 V2 l& R0 A3 r9 e#define SHAER_RAM_SIZE         (0x20000)   
1 l: c0 g/ \  M. ~! L1 k2 K
7 D* \+ y  p( H. M) Otypedef struct$ G+ ~- p2 j& D. B, j8 W
{
% _/ M. q! [' B: _& {" \        unsigned int a;9 X. y4 v# }5 L! `/ c# M
        unsigned int b;$ b7 `/ A! v! V3 T0 ^
        unsigned int packet_cout;
$ O4 H: i, ]% c) x! |" c- Y7 {}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 r' ]- ~# Y% i& s4 I$ s& _, r1 X( ]4 z0 c' G: W8 N  H% O0 @
void read_MSG_buffer(int *baseaddr);
) i+ d- k8 q8 N$ O- A5 g6 hunsigned int count_copy = 0;
1 P2 L6 {. f9 D+ G' J. z! E
: Z7 W" C9 D3 Dint main()9 `" d4 z1 h* ~9 z  ~& Y
{( d! a  d0 W% s3 s. _
        int fd;8 @# U+ x$ f, [1 p9 v
        int *mem = NULL;7 a! {9 l$ \. u# `# d
; e8 P7 C) h* m: Z  [  }: r( g
        if((fd = open("/dev/mem", O_RDWR)) <0)
# v; |+ y1 q2 t+ J, W# _* j        {
8 e% V9 I' u& P. t( Y0 E, B2 [                perror("open error");* t( L1 O2 S- f0 Y" d
                return -1;
- y4 C" k$ q$ Y        }/ P  }6 U* s2 d- [
        8 C) l) K- {2 e
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
5 `. B3 Y* i; K7 f( [, ]
% [2 ^% k! ?+ ?: I- W        while(1)
( Y1 Z$ ]- B% D; L3 x" r        {
. V  L' v6 g' s! \$ Y# Y4 u                read_MSG_buffer(mem);* Q% o& ?* b7 ?( \# F
        }               
; E/ Y9 u4 X+ T3 k}
/ S( o* v* s/ u* `% @, r
( J7 J- E+ Q9 u# s6 Lvoid read_MSG_buffer(int *baseaddr)
) ]; V# g0 L5 `+ i9 Z8 |* M{
1 V" ~+ I, x6 W# S: U- d3 V, E        pRX_MSG_PROTOCOL pshreRAM = NULL;3 `$ I) M% |/ p1 {% B

) @* N: g; H9 X- S) l        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;7 G$ V& {+ R$ F! B" L+ g9 j- ?; W
8 a% `8 ~1 U" ~( S4 T$ s
        if(pshreRAM->packet_cout != count_copy)
; L3 L3 q8 P5 Q        {
% a. _: i' [. k, {. s                printf("a is %d\n", pshreRAM->a);. j% J! R: Q1 V- d( w% k
                printf("b is %d\n", pshreRAM->b);1 y% t7 ?  R* h
                printf("count is %d\n", pshreRAM->packet_cout);" ^) C* k$ R( o! L9 l* V; V
                count_copy = pshreRAM->packet_cout;
; M" k, g, `" j7 V# x. ?4 l7 ?* @" ?        }
; I) v1 R. q4 f        else" ~+ v$ M5 L+ _  b! ~. B( y9 p
        {6 k8 y' ^* _3 S. {
                printf("No effective message!\n");
7 H& `' U$ V$ o2 z3 w2 R7 B( ^5 d        }
( {* Q) L  z" d+ t- y: w& e6 @2 @}& M) l1 W. r. ~1 E0 J
  i+ U9 W3 m) O+ `7 E  c. N
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
" q8 N. X7 T% Q$ v( Z% L& i. X7 K3 _8 a

1 F% I' }# ^9 {! U! S! q! n# d" x
" c1 G% o" O2 J" @! Y0 V8 P% G! a- C/ G4 G7 H6 r* K% `8 e* q% C
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-2 18:28 , Processed in 0.041318 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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