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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
' j3 C" W0 _, ]9 b
+ g" m/ G& X5 k3 GOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>* G+ u) S7 j% C" a2 p: A
#include <unistd.h>
. S8 S# `7 W! K#include <sys/mman.h>0 |4 |8 K" [( i% w9 G
#include <sys/types.h>
) l8 `+ ^! U. T2 [* u7 T9 l#include <fcntl.h>: F) b7 W) T# E7 E2 y  l
0 ^; x- {2 o% o. D' I- ]7 U5 {  H5 {# G
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
3 e& M2 s$ E  n% S! |( L
8 M( S/ l2 Y- ?! _0 ftypedef struct$ g- B0 Q0 E: x. _) b
{. V  k0 V, x/ l! m+ f* G
        unsigned int a;% }# ?& W7 a- n& ]
        unsigned int b;
6 e' v! X+ D$ |/ h( y3 X$ c        unsigned int packet_cout;, F: j; L1 w0 K+ g6 I; N
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 F; b; O8 i# T! C9 G3 z! O) l8 e. z+ ~& A
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
8 `6 T, A% }* runsigned int count_copy = 0;
; d6 u7 g2 ]7 }7 Q/ R* H' a7 X9 l. ~7 F6 R& c4 n3 i

$ U, ~& e9 c, u8 u/ n" a5 Aint main()
  s5 U9 o8 i! k  O9 _3 U+ i{! Z8 U' t0 T$ e
        pRX_MSG_PROTOCOL pshreRAM = NULL;/ G3 P# ?! }" t' B( ~7 X. V
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;9 W) I. ~: o/ A0 F: W% U

* r- N! \5 z" W/ h        while(1)6 T" @. U4 Q, R9 ^5 A
        {
  G! a4 u$ u6 b0 k9 {9 [( |( U                read_MSG_buffer(pshreRAM);
/ w+ c7 g+ S  h% l        }               
; r2 t7 k6 P9 |4 F+ H2 m) w6 X( t}
/ H  ~& r) b0 m* O; d$ C2 ?% `  S- {% f& \
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)& l# v: ?* B( g1 N
{- I8 g) F. s3 f7 y# m* J. c. `
        RX_MSG_PROTOCOL buf;0 j" M$ A$ l; F2 u4 o) l9 O* M0 n! ~
        
4 r! D, @* {3 w1 b6 ]$ o1 C5 d        buf.a = pshreRAM->a;% n; k3 N" ^. @& s% T2 @
        buf.b = pshreRAM->b;) i2 H. c0 C& q
        buf.packet_cout = pshreRAM->packet_cout;
9 U8 Y; l# L% b5 w6 U        & W8 x- h# J% l" H/ T) q
        if(buf.packet_cout != count_copy)* L$ p+ E5 P# P! I0 ~3 z( Z
        {
1 Z( T7 R' o$ o6 q1 O                printf("a is %d\n", buf.a);4 M$ n7 W  Z/ Z  E  {
                printf("b is %d\n", buf.b);
9 L: t! S7 i/ v& _3 G( z                printf("count is %d\n", buf.packet_cout);' J9 ^4 j: d3 {7 C5 v
                count_copy = buf.packet_cout;1 k1 J1 D+ V, Z: v# f
        }" Z! L( [5 z; D4 W6 k" z) y
        else
( D1 Y$ l7 W  m3 h0 U        {
( x1 |1 r' C, t) P. C* j                printf("No effective message!");
% @2 T2 \- B, D        }
$ L$ a( M% L$ S3 Y- n" c5 _, S}3 T. y7 m. g% t+ Q4 w, i6 {

  z4 p. F8 K: m* T0 G2 J% E. ^$ Y$ ~+ _& ~* ]: g
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。( Q# ^7 |! t6 c& x0 @( d+ U+ u
使用下面代码,对内存使用了mmap函数后:( ~$ r( M0 H8 \) F
#include <stdio.h>
- S7 B3 C1 \# P+ B. S3 E#include <unistd.h>
# f; V( W/ h. J! L+ W8 k# y- S#include <sys/mman.h>) e9 p9 J: L2 ]$ ?- @$ o
#include <sys/types.h>$ D& Y) K7 [2 p7 l8 p9 k: {
#include <fcntl.h>2 S" s, W; l  @( A) o( D. F" I
  c! u# X2 Z* N+ L$ f
#define SHAER_RAM_BASE_ADDR    (0x80000000)+ w/ X4 _! i) ^% A) ]4 l
#define SHAER_RAM_SIZE         (0x20000)   ( b. T$ q( D- w6 @
- L& ?4 y9 g) G. t( G! ]0 i2 s0 T
typedef struct
, x  w; V9 b: n) `4 z{" w! \$ P3 p% r1 j
        unsigned int a;; M9 |8 N0 a* e) C$ V
        unsigned int b;, h* Z, o2 k. h
        unsigned int packet_cout;: R; t( j) _3 A8 o
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;  Y9 v6 h7 v& Y: C$ y

# u/ `5 M0 U4 uvoid read_MSG_buffer(int *baseaddr);5 ^# C4 J+ ?+ M/ |5 f8 ^8 X
unsigned int count_copy = 0;" e0 J5 \$ f8 X
+ P9 f& q- F$ B* m; N  R9 g0 _. I; T0 [
int main()
' o  i- d( f4 w) w* K; X7 ^{. p( A5 X. o) {9 U: Y; @
        int fd;
, _) r  j1 l/ e; |! q% q7 H, _8 u        int *mem = NULL;
; s/ Q6 H4 n3 s  V' |% X* [" [. }9 _7 e8 s( x# |
        if((fd = open("/dev/mem", O_RDWR)) <0)
; b0 L$ ?7 `5 D5 R, N$ I        {- m9 [; j* m$ @
                perror("open error");
, a7 n+ I* M: t: e) v) R* _                return -1;6 \2 s" @* {/ Y9 U3 L! L% D
        }
5 d* D' t6 w6 Z0 G1 }- s        
% y, C$ Q+ R) `+ o; S. t2 m4 Z        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);* D: S3 |1 |* T  ?( W/ D  @( V

7 _, E  \/ ~  G: I. K1 e        while(1)
1 G6 p0 e5 |/ S  m7 h  r9 e        {
# E: |( m* f, q' q/ X                read_MSG_buffer(mem);
+ E8 I1 A! \; [+ ^/ M% y        }                2 t# I/ B5 M" _
}
1 z4 V1 d! t8 p4 W; U
4 n: M$ v) [& M5 Kvoid read_MSG_buffer(int *baseaddr)% z! G- ^- E. Q+ N6 _5 L
{
( M5 ?9 C9 F* e: W. B& K        pRX_MSG_PROTOCOL pshreRAM = NULL;9 U! t! P- p  z" h

9 @# S! _+ y7 p' j* _3 f1 j% Z        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;* U/ T! E- E! D2 z0 w9 z6 W
! O4 [" D0 f4 G) z4 c
        if(pshreRAM->packet_cout != count_copy)5 P3 }0 g7 _* y, @8 o
        {
: h' W& E; b  Y+ b2 k                printf("a is %d\n", pshreRAM->a);
9 s5 _6 R  \# e* E: P                printf("b is %d\n", pshreRAM->b);
5 Q7 J$ }$ k7 o                printf("count is %d\n", pshreRAM->packet_cout);2 H7 G% _4 l" p1 P% z
                count_copy = pshreRAM->packet_cout;
9 }4 @0 K" N) S        }
% u3 O+ _" o, L        else
; p) t8 _. O# W        {2 m3 L! d* H: A0 v# x. a* C
                printf("No effective message!\n");! u4 {! M  F' d% u
        }/ P$ y8 W/ ?, t, {, G% u9 h
}
  X# x7 F1 ^8 I# O: }" @0 v5 o7 c' A& ?( t# M3 ]& x: {) }2 u
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
2 Q! D# s! ?5 P/ s0 [. L/ Q4 k- P8 n! v, |8 d% C
& N+ k% s; }& j5 d3 ^  Z
+ A1 c5 y9 d  a1 `

% u6 }% O& c4 `7 Y9 B: u1 y5 `
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-19 14:16 , Processed in 0.041033 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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