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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 7 q3 N' Z( x! r4 G0 J7 ^

4 N5 i; c1 m4 h, L: ^4 D5 sOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
4 P% \' H; v; Z, d% U#include <unistd.h>+ z: k7 O. w$ k$ L4 U) K# t; ~
#include <sys/mman.h>
; U. E& p0 ], K0 I/ @#include <sys/types.h>( C5 }7 R4 _( V/ k% P# g! U
#include <fcntl.h>
4 Z8 L0 e3 m$ S) u+ C& D3 S/ X
6 {& n# D0 S! f9 M#define SHAER_RAM_BASE_ADDR    (0x80000000)   
4 }6 p7 z& V: V7 K1 [; [) \! H. {9 [* w+ w) h
typedef struct
$ w" H4 |" ~. |1 S{% t3 j2 A+ y7 ^* A. b& C
        unsigned int a;
  d7 ^! s, l# i" H$ i        unsigned int b;
6 v5 n/ p9 z% p7 `        unsigned int packet_cout;
" G7 J7 x( v9 T# M. z$ K}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;5 q/ T! Z! }2 i" Q9 \8 E6 N$ K
1 @; R1 W8 u" _& L: {0 ]
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
3 @. p. N9 y5 g+ x! [1 U$ n2 u& ^unsigned int count_copy = 0;
4 _& B' r  n4 a/ J6 S" g; B5 o
( Y5 [8 s+ m+ E6 P: S) z8 C% |5 w
int main(): n1 v8 L$ n* @1 q' ~2 F9 f+ b
{% L" m( J0 e7 h$ c, w' Q2 |
        pRX_MSG_PROTOCOL pshreRAM = NULL;# ]  u3 W+ A5 a! a5 B  m9 t) U
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;% j' \$ H/ c3 I) z

( x3 L" w6 H2 r% ?/ _        while(1)
5 `4 m. P/ k' \4 G! B        {/ ^5 h. ~' a8 |2 @- D" O
                read_MSG_buffer(pshreRAM);, o* m1 p$ G% b" `' E' F
        }                3 l4 [. h( A/ f* }- o' Q0 g. d) s
}
  H% |" W% t# `8 \' Y* o  g6 `7 |
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
' ~+ O% ?! k: n3 h5 C7 v4 D% z( }{
% l. q2 b9 f/ U' U: [        RX_MSG_PROTOCOL buf;: I4 Y$ s6 F6 V3 r: R% _4 d" D( S0 {
        
* y5 P* o3 A4 ^        buf.a = pshreRAM->a;$ D) X- {/ I( u0 l9 L
        buf.b = pshreRAM->b;3 T) q: }) J  x# c) Z
        buf.packet_cout = pshreRAM->packet_cout;1 B% _; E3 m. l: |1 m
        * ~, u; d% Z' t/ @4 T8 X. y
        if(buf.packet_cout != count_copy)( }/ r, P1 Q5 j. s$ D& Y* i
        {
1 P  ?4 \( C/ {3 z                printf("a is %d\n", buf.a);
! v# k! ]/ X: p+ p                printf("b is %d\n", buf.b);
  p: C7 B0 @0 @9 f+ X* v9 |" r                printf("count is %d\n", buf.packet_cout);
1 W# e7 M1 p6 l6 v1 X7 z6 z! C4 t                count_copy = buf.packet_cout;
6 i4 [  K1 ]1 C0 u  D        }  {7 |, `4 h% I. r: L( E) d' Y4 G
        else
6 t# J4 T. N- f, z" j        {
# ]. N) O1 I6 V0 c6 i+ M6 ]% c                printf("No effective message!");
! @+ g  N* C% b& ?        }
& K& F7 s2 f& j}
, h8 \) \8 f. l6 I
! u6 t8 K. C& ^& u. f5 \2 ?8 y( A  y! M+ u
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
0 d. q4 ?3 Z! D( g& Y" e使用下面代码,对内存使用了mmap函数后:
: t6 f4 O; ^7 m" H* y' Y- a#include <stdio.h>
. o8 e/ ?5 J! `, r2 w#include <unistd.h>
+ @4 k. e6 _- H7 O) j6 N#include <sys/mman.h>
7 n/ Y: j& O4 R! I* x#include <sys/types.h>
% t5 ]6 G" U. k; L$ e4 ]7 o' m#include <fcntl.h>
# b3 p; s4 S, G0 [0 x% C
- H; I8 \* p* z% X' V#define SHAER_RAM_BASE_ADDR    (0x80000000)
0 Q+ j  T$ q  M. ~5 n. z#define SHAER_RAM_SIZE         (0x20000)   " ~* z. Q; |  ^8 Y( g  M6 j3 G
& v# J" }( N' L8 G& g+ }0 D. i
typedef struct$ ]2 m8 Z- j: S
{  C/ u+ ~2 L; V+ c- C
        unsigned int a;
. S: J/ Y9 q) b0 E/ u4 j        unsigned int b;" \, R. H% E- [, X
        unsigned int packet_cout;% {2 ^& {" {; e! `
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 L" h# F( l# D7 p5 D5 N0 N6 V/ O+ |! _, n% B! n: Z
void read_MSG_buffer(int *baseaddr);+ j2 ~* C* K0 o) g/ x+ @  \
unsigned int count_copy = 0;
1 s) @- U. O) M4 o% `5 V3 \; p5 e' s8 x: b; w
int main()3 \; D$ |! u- s( q1 ^
{
( o8 V3 H" N: G# y, Y        int fd;
7 g! S4 c! I2 g& Z; z+ L" ]$ p* K        int *mem = NULL;1 |0 U0 j( p2 z( ]& s

; a" W* x) E' S9 k        if((fd = open("/dev/mem", O_RDWR)) <0)
" C* B3 s) }2 b' D$ Q+ [! ]3 O        {! g  ~! H' X3 f
                perror("open error");
' _2 L9 w: C" f0 E                return -1;: b4 I, u8 e7 R) f' l0 f; Z1 E$ N' U
        }
. Z, _- p9 Z- t% l        8 r' ?  F, S5 X, E9 i
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
7 Z- U; o8 M0 T8 l) |" z1 k1 e& I* B# `9 z
        while(1)
8 e$ e$ l- Q0 I' o/ E8 W/ G' |% F        {
, i4 c. [$ y, S0 G6 |# v. }  I4 C                read_MSG_buffer(mem);
# \( s, P% K7 e        }                % P4 `8 l6 ?. W% i" _
}0 L8 s6 D3 L9 A$ w5 X: _

5 K2 I- s2 C2 F# S1 p, avoid read_MSG_buffer(int *baseaddr)6 t# o8 W9 [/ I6 a; O
{1 Z/ \# @" X; n" s& l% b2 d0 U5 n! `
        pRX_MSG_PROTOCOL pshreRAM = NULL;% `8 V8 {( o$ t8 y: W

) Z3 r! M6 z+ h2 b$ X$ p5 K0 O        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
  l+ ]0 O) s7 b
0 v4 W* h8 w$ t) |9 w4 _        if(pshreRAM->packet_cout != count_copy)
6 f" u5 w% B: m0 g7 ]! [        {# f9 b7 V8 h' h# [5 R7 ?3 @% ]
                printf("a is %d\n", pshreRAM->a);
6 g+ p- I4 i: y6 _                printf("b is %d\n", pshreRAM->b);- I1 H8 B& {# K
                printf("count is %d\n", pshreRAM->packet_cout);% i- R# H6 p3 {
                count_copy = pshreRAM->packet_cout;
4 _0 e/ z% a: N+ m9 f        }
/ R, t* ~3 ^: i6 a* T0 }! |9 ?        else. C. @1 u0 ~, T8 k4 r; v3 r
        {7 L/ r4 v3 B: K( h' D3 r
                printf("No effective message!\n");
0 r4 n/ [8 E/ X6 F        }, ~7 ~8 C5 p8 s6 s" g0 m
}  ~& R) M" D' k4 r' d3 F

1 \& U  W" f" _8 s* q( m' e没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???2 w" C! l0 z7 s: M5 h
+ Q# Z1 c  Y% D( F

( V( n5 z" a/ V) `! i; b: C$ }: o$ U" E5 B8 Q) A
1 b& M, Z/ g1 ]5 q
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-4-3 22:39 , Processed in 0.041619 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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