OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 5 ?  r" O4 S4 ?$ L* b

1 Y* w* L% J) M/ VOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>% D' _' `1 d5 V2 C" b2 ?$ U4 A
#include <unistd.h>
' |; R4 e" \- I+ l: f* V#include <sys/mman.h>
  I7 R+ v; Z# j5 b% L  h0 Y% P#include <sys/types.h>
& M0 H" ~' A& I8 u9 p# N#include <fcntl.h>
" U* C: A" z- ]% C. X, ~: H& z" H7 Z( P
#define SHAER_RAM_BASE_ADDR    (0x80000000)   4 T9 h2 g9 U: s: f4 r# i
- F4 H1 r( d: t# i, h: a
typedef struct7 ^/ ]) {( C* B  h
{8 d) S& W1 a1 E
        unsigned int a;
/ c/ o! j1 f% i  i. n3 N. d/ V7 R        unsigned int b;
" \, ?- _% d) C6 o$ j8 x        unsigned int packet_cout;( H. ^+ D5 K4 {! ~: G
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 F' V( G2 y8 ?4 T' ~
9 l1 s, r4 E9 I+ a, P0 ]% P0 bvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);, _& m! B" o8 ?6 x5 ^
unsigned int count_copy = 0;
8 ?0 p% w& t/ e& V3 q7 _, J' j* ~, z. r8 x4 j5 C. M  B- I

1 K" X" M  d2 D& {- J2 }int main()
* D4 T1 r7 D7 I$ T% l1 j  i{
, F) J( n/ T  X, n        pRX_MSG_PROTOCOL pshreRAM = NULL;
8 n& ?5 O6 X  u) f7 z        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;: O' p+ X5 v' l/ b

3 [' V$ U0 n4 q3 e        while(1)
: v" h5 [8 R( U' U7 Y1 b        {
+ c, C  Y, F6 j5 X% U1 b1 b( C% n                read_MSG_buffer(pshreRAM);1 c# s+ x' v6 r/ [
        }                - E  V" v2 G$ m
}
) n1 L. j  C9 h/ n; W0 [; B. R" z' F0 L  ]' ^8 j
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
5 E( W3 |5 K# k% ^% c9 t; c  j{- U, M/ O/ i! f# E
        RX_MSG_PROTOCOL buf;
8 Y+ l8 p' a4 ]7 \' K* ^        
5 e  i/ I3 z$ D2 T' k0 J* i        buf.a = pshreRAM->a;
. n1 |) L' d- o        buf.b = pshreRAM->b;" u& O( F* ?% |5 s  R1 E0 @
        buf.packet_cout = pshreRAM->packet_cout;
, _0 T2 a8 M4 h& p/ O/ g5 n/ A        
. s9 ~- b" K; T1 {: f7 B        if(buf.packet_cout != count_copy)
/ m. u; b) Z# y+ \# P0 f        {% `1 ^6 P6 W& P$ N3 v
                printf("a is %d\n", buf.a);" f5 q5 `- H, e
                printf("b is %d\n", buf.b);
4 X5 P2 q' C8 e2 _1 D                printf("count is %d\n", buf.packet_cout);8 S  U8 l/ B7 h9 A4 R
                count_copy = buf.packet_cout;
4 P4 o& C$ j* s. k        }
$ [, Z5 a9 d) W        else
! E) h% L: Y* x* ~7 ?+ h        {- ^, Y8 A6 D4 c# F! P. t0 p8 b2 v
                printf("No effective message!");
( T1 G, _, |! r/ R8 I0 ^        }9 a) c7 l! m# v* E
}: Y  ?& t6 S( w. c$ p/ g% {

1 r7 f# j0 [" C5 t" o- _; R& n0 G& S1 E5 l8 l
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。1 x. _: T" y, l7 A5 q
使用下面代码,对内存使用了mmap函数后:4 Y* Q1 s) E1 e& A
#include <stdio.h>* s7 w  ~% D4 m/ k1 x0 u. `
#include <unistd.h>' K9 o7 `/ I  v. E
#include <sys/mman.h>, y# k0 u$ ~: b4 {" h  E4 ]0 d
#include <sys/types.h>
$ Z8 I  d  F8 j0 j/ Q6 ?#include <fcntl.h>
( W: u  d, O2 Y- |+ D: |* i
$ Z" [# \9 ]; ], n  w* ~#define SHAER_RAM_BASE_ADDR    (0x80000000)
- t; ^: D/ V9 o9 y% o3 ?#define SHAER_RAM_SIZE         (0x20000)   6 g  T# j0 q2 U. `0 R
& C2 g4 F: _7 l5 e
typedef struct) P' W1 x( |, [: C
{
" G& [7 Q1 B! d) Y        unsigned int a;
- a3 T) h2 E$ N        unsigned int b;
5 ^( D4 o6 e/ O# a7 a3 e        unsigned int packet_cout;
- ?" B5 F- M9 a8 P) K1 \}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;# \+ I; p, M; _# z. {) e- K3 h+ ?

- B- o7 U: t# ^void read_MSG_buffer(int *baseaddr);: |: @+ z& e4 i0 |
unsigned int count_copy = 0;
0 H, u* u. H3 I7 u" z2 P4 I* x
( b8 ^, {7 d1 s: _0 m3 o3 p+ Sint main()
5 y) _3 `8 u% c8 H9 Q: a{
. d# P& `) T) e        int fd;8 N" H5 ^( t2 L- }* \
        int *mem = NULL;
$ `9 o. w  Z' A; h/ w! O! p; W0 c) W! X! v
        if((fd = open("/dev/mem", O_RDWR)) <0)
, d* K/ S1 I- P9 m' ]        {
; y9 U; ]0 E, w. }4 V                perror("open error");
7 T/ ^, R, h6 M# o% F- F+ o& c                return -1;( W# Q, |+ E/ e. C4 Y9 N" |8 |
        }9 ]/ j) a( ]/ L6 a2 T
        
. v, N+ A( T0 U6 a1 E; r4 }        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);+ K2 E. C4 a/ q* i' r& g+ r
6 Q; W$ C$ z' L2 s4 D6 c2 E9 I8 i
        while(1)
& v$ t! f0 |8 P. O        {
* ^: K; J* G4 `! r2 {" `                read_MSG_buffer(mem);
7 k0 b: G( B) s3 A- [        }               
4 N" T# M/ [5 _/ w8 Z}( }6 M. i( i8 Q* N" M
# N( }0 k1 J) c8 O! D- {
void read_MSG_buffer(int *baseaddr)1 ]- d3 S, B" B9 c# P/ Z; C
{
- F1 S( R) p5 B# X! q        pRX_MSG_PROTOCOL pshreRAM = NULL;
$ p( ~' g4 c6 _3 f2 ~$ o6 H; ]/ I/ D% a; L% ~5 z- M
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
. l7 ^0 h7 h6 c- Y: |) ~; y7 n) j; r) D1 O; Q' Y0 t1 a
        if(pshreRAM->packet_cout != count_copy)) G. T6 {5 l; a, u/ j& i0 m, u- z
        {
! y- i1 ?& T: N9 h3 g                printf("a is %d\n", pshreRAM->a);
  }  c) D, n/ j. v                printf("b is %d\n", pshreRAM->b);$ n; r- \$ k( i4 ~3 A
                printf("count is %d\n", pshreRAM->packet_cout);: ^! y8 g( O2 |0 u( M; L
                count_copy = pshreRAM->packet_cout;' O% u9 m# S" K
        }0 n$ j* ?4 R9 l
        else
8 T" S' V8 r/ u# |4 z2 q8 ?        {
/ r/ L) d& n/ E' S                printf("No effective message!\n");4 |4 \9 d6 R) l& k
        }, i2 E4 W" F9 V" ^$ h$ K& x+ ^$ M
}# F2 ~. _- v$ F+ x4 F2 s

0 e5 k' }8 P" z* T. \没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
% @! n" H( g& W  T: B( K$ p/ f  C' E+ E. r
/ T* L  b- u. |* E/ K$ G: a

' {; T/ e( R$ P& @7 y. C
9 B6 @6 O  l8 J5 L$ h
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-22 06:31 , Processed in 0.037390 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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