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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
- A* y  M; c8 A% o; b7 X' t9 U1 \3 {2 I% f- Q$ a
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>: V5 R; @. O4 U0 S" A1 s' L: U
#include <unistd.h>3 S. F6 o3 ?( q/ q
#include <sys/mman.h>7 {0 V& @) b  R. O# t4 t: A
#include <sys/types.h>
; U. O( F! t, o* d# N7 s#include <fcntl.h>
0 M! O8 {- j  T* ~, p
9 s. c# G& y4 V3 |- @#define SHAER_RAM_BASE_ADDR    (0x80000000)   + d8 B. v# ]+ b% c! I

, i3 |2 u2 w* E! z$ n) Ltypedef struct0 ]4 U) C0 i6 @4 i9 x% i
{
, `7 X8 Y2 z2 l* a        unsigned int a;6 i( C9 y: x" s+ B
        unsigned int b;: o+ T) i; S+ s9 L
        unsigned int packet_cout;" L5 q4 ^$ Z  e  C
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
# l+ B# z- I" U; H$ B! {
! f' b8 x; E; cvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
9 R$ y% l) L) u& P- q) ^unsigned int count_copy = 0;. O: V8 W7 q+ g/ a8 X" _5 @; W

8 ?# @/ t4 ~2 ^/ y' k% _0 J! S  O1 f/ m' z
int main()
- x) y4 s/ c% ?9 n- Z4 t{! p  u+ ?* [0 G( U$ J0 y# |
        pRX_MSG_PROTOCOL pshreRAM = NULL;1 G5 |. k  V2 d, I9 \
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
* n7 m8 h% Y; J. @. n8 S
) b, n  S$ b/ k( C' [2 j        while(1)  n" O: w* C2 N' G3 j, v
        {5 s, d7 S" p! w4 L
                read_MSG_buffer(pshreRAM);
! N. f2 I( w# h# p) F& s        }               
7 L( Q7 S1 p4 W5 j% h. u# b) s}
1 ]& q- O: c! J% {/ T, r5 U* R2 S
0 \& n/ t2 }7 a& V8 Ovoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
! g% F) b- V) M2 \/ y{7 O2 N, ?5 k1 U5 T
        RX_MSG_PROTOCOL buf;
9 d( A" H1 u: L. g8 r, I: N        * c& T6 D- k3 p) A
        buf.a = pshreRAM->a;% a% ^1 p& d, K# B
        buf.b = pshreRAM->b;
( O+ p" ~6 j& a" a0 p( X        buf.packet_cout = pshreRAM->packet_cout;( a- q$ ~* w& t1 A/ @
        5 p6 ]' J: N9 v3 O
        if(buf.packet_cout != count_copy)
! ~. U/ E6 V3 k. n* T$ x/ D1 I        {
' L* ?6 t( x1 Q4 B+ l$ p3 Y: S0 H" s                printf("a is %d\n", buf.a);; E" v/ V7 Z7 l  B! E" n; D
                printf("b is %d\n", buf.b);! e  F" @! l; T/ h: o
                printf("count is %d\n", buf.packet_cout);
8 z8 Y% m! @0 E# f- e                count_copy = buf.packet_cout;# w# Q& r3 f/ o
        }
+ L2 y8 [6 Y( |8 w        else
  w+ x7 l1 v3 M6 o' p) ?        {
6 W/ T" U3 J$ @3 ?) H                printf("No effective message!");
: K5 y" s& o  F" _% U* ?; B        }/ E) R0 x, x4 N$ i% W
}/ I8 b( p. h% T( ~6 n( E4 D

, D* Z5 N8 P0 i; _; Y
, q# X, L" a2 i3 W! o7 D但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。8 D1 B' E5 J- I% ?+ S
使用下面代码,对内存使用了mmap函数后:- k- s# b& L, j" U' {- {0 G+ w+ o
#include <stdio.h>4 C' i  p: }- L8 Z! _! e
#include <unistd.h>) \/ @9 N/ O* m0 G! F/ `) @! Y
#include <sys/mman.h>
& m% |1 M1 {, C' ?, u3 X7 h#include <sys/types.h>
9 |! o5 f: v( c& }1 A#include <fcntl.h>/ c+ t% [2 O. Z3 |+ ~
; X* Z9 t4 i) k, `
#define SHAER_RAM_BASE_ADDR    (0x80000000). f. w3 k. ^& Q3 l. A7 K+ @
#define SHAER_RAM_SIZE         (0x20000)   8 P) c, d& y7 V) a/ `* t2 |) {
) }" A3 {" Y1 @4 O0 M
typedef struct, I1 N' i3 m% F# r6 m6 g
{2 G! v2 B" k. B
        unsigned int a;
- h* \  v) S# u        unsigned int b;3 J: h2 x! ]# {
        unsigned int packet_cout;
. z2 G0 j! {0 l( Z+ x' r6 \}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 m; z2 C4 }$ G- _  `% D6 X# m7 B4 E
- G# k* V/ |. G8 gvoid read_MSG_buffer(int *baseaddr);/ K* i  |. w: A+ H2 F* [; o
unsigned int count_copy = 0;, F" b& H; A' `2 M& r* ^/ h

& v1 x7 ^5 Y/ d. }' Eint main()4 _: M2 q4 a1 c6 j9 x/ l, X2 g
{
. c0 z) N# Y& h        int fd;6 x% i1 P6 l5 ]5 J. c
        int *mem = NULL;4 W" \1 d6 H, J! H+ G
# H3 O- Y; V* T! }
        if((fd = open("/dev/mem", O_RDWR)) <0)
4 \) m3 g, ]* x( |        {
: b) G7 F- N0 F- `                perror("open error");
& N9 `* f# z: x                return -1;
( J" s9 R2 v/ |8 Y# Q. {6 ]; S8 J        }' X% d0 V# Y7 g  Y$ E: v
        
: j/ s% Y7 k) I& ]2 I8 W        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);% A2 F# O+ l, p6 }9 L3 S, K
, d# Q- J- r/ A% t' L3 k
        while(1)5 D) |8 W1 Q. M. X: Y. |
        {5 \" x5 L6 D2 o6 @# S
                read_MSG_buffer(mem);& {" a" o- ]- q% L/ ]& ^1 G% l: F
        }               
' ^1 u# p: Q, X. j& K2 S5 D}
0 p. }$ _  z$ J2 e& C3 Y% j( b1 J+ r) m2 y- |& P1 t# A% i5 G* E
void read_MSG_buffer(int *baseaddr)
) r4 D, z0 @! P% T4 U{# D& W4 ?0 r6 ?. g( X  x+ N
        pRX_MSG_PROTOCOL pshreRAM = NULL;
2 B( _" {" `! d' r4 c  Q3 b
+ {" p4 |- b- Z5 X        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
6 h6 x; a6 b! J9 I/ ?  V6 t8 i  v: s) k) D8 L/ a, }( A
        if(pshreRAM->packet_cout != count_copy)
. _, r# K/ q* i' N5 q        {' i9 l, I* D/ Q& e
                printf("a is %d\n", pshreRAM->a);  s" P2 F+ ]0 t: L5 P% q, ]1 y8 [
                printf("b is %d\n", pshreRAM->b);
+ s' x% ]9 n" _+ r                printf("count is %d\n", pshreRAM->packet_cout);  `* |% M# Y& P; V
                count_copy = pshreRAM->packet_cout;* k( W$ D5 B9 Z. {, _2 ]
        }
2 j5 ^1 q6 L8 B        else# K; G! I. ?/ B# }9 @( {9 ^
        {
, \. n4 C3 {' y                printf("No effective message!\n");
# r. a9 C2 G$ z; r8 o        }" h( n& u% u2 I; x
}% ?' M5 ]- ^$ i$ ^
# Y1 Y6 F8 p! }  ^- ]
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???: p- r" h/ U4 {% ^4 g$ b8 H
/ t9 g2 q5 e- W7 O: {) p6 x- s
4 m( p- w% D$ b0 I4 O2 e; m

. T0 p5 A1 W* `# x, w: F( S2 w3 [9 d$ t; h5 N$ I4 P
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-17 02:32 , Processed in 0.037482 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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