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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
( ?; c3 B* ^5 `5 g0 ^
1 F% s& R2 X+ c# f  h" HOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>- \$ |/ h: q# ~8 @0 ]
#include <unistd.h>
0 @$ `! r/ _2 d; \3 _0 ~) I#include <sys/mman.h>- W. x$ N4 L! F% j  o
#include <sys/types.h>1 t) J! M# y0 b
#include <fcntl.h>6 W& L. Z6 \7 j* A& x( {

# f5 z+ V6 v! W#define SHAER_RAM_BASE_ADDR    (0x80000000)   ) [6 Z! W% ?0 `5 y) C+ u

" O  ]+ {- U+ F! ^+ Ctypedef struct
( \) y1 Z3 j' U; |; n# J" ~{
2 A( S2 h1 Z3 e; m) O        unsigned int a;5 g7 A8 m& x+ h; u* }  `
        unsigned int b;
- t. e1 h- a- W; B$ g+ g        unsigned int packet_cout;
% [' L: K6 m; s) F7 \}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. V7 C* {, J5 x5 p0 h8 H8 p; S! N# n9 l6 N5 W5 F4 g
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
4 ~$ n, F* E1 P% ~- o5 [unsigned int count_copy = 0;
& l, ?7 F) W, o" k- G" `' S
7 p7 [+ }& L( `5 x4 U# C0 ~, k1 I  j$ T
int main(), d7 [6 ~2 ~/ s5 w5 |
{
  W7 m  Q$ U9 B- ~0 g; Y( E        pRX_MSG_PROTOCOL pshreRAM = NULL;/ m) Z7 J% N+ x/ U
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;7 ^6 r. O( w: a" Y/ c8 S
5 N% h7 q& g9 Z# P. B9 h
        while(1)  w3 G" z8 ^) r, c2 r
        {' W$ R8 k7 N) V7 ~% ?' s
                read_MSG_buffer(pshreRAM);
+ a, T! ^. M. A  P" C7 Y+ G        }               
! ?: w1 m9 W# {- ~}
+ q5 e7 h" b9 F( t4 y! U% [7 c* d( i& `- _/ Q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
( T. `0 T% L8 {- u  }( R/ `{
9 U7 Q2 |. J, a- q! }" ~        RX_MSG_PROTOCOL buf;
! A. X9 S: x" G$ z        : @0 I; `5 X& M- w9 ]. E- y
        buf.a = pshreRAM->a;7 r0 |5 |: c; a2 L
        buf.b = pshreRAM->b;  ^0 l6 a& n+ o/ J! ?& j
        buf.packet_cout = pshreRAM->packet_cout;
* ~% Q6 {7 \$ ?, C1 r4 R7 V- [        
, f/ D3 B: P+ K% v2 _        if(buf.packet_cout != count_copy)
! q$ h$ g# v& Q8 L( K" E! _+ U: l        {
" S9 ?# z& Q  r7 f                printf("a is %d\n", buf.a);
- f1 z! B" E# [* I/ s' N) J% D4 \                printf("b is %d\n", buf.b);6 ^% Q" I7 p/ b) _0 T- W9 @
                printf("count is %d\n", buf.packet_cout);2 S/ [+ F" F, p( v$ s+ F
                count_copy = buf.packet_cout;
$ v1 O/ C' N: p7 A5 a7 b        }( t$ B9 ?; r4 l" g3 k9 g
        else
, k% G# n6 R, I+ ?' Y        {
" ~. |& ?, D0 R3 n1 x  ?  n                printf("No effective message!");
" u3 r# g4 R2 A        }
- Y% `: G+ l) W1 D* r& y}
% z8 }( r/ _0 \+ ~2 h! Y" a$ w: H5 u+ h$ @0 Y- T' }( y

1 g/ m% {! \8 j- l) o2 R0 E但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。0 P' v) I* R! s0 o9 s5 p; S
使用下面代码,对内存使用了mmap函数后:
9 c( T) a$ K8 Y; i1 A; d0 Y& _#include <stdio.h>. v2 S' ?4 ~4 R
#include <unistd.h>' s( p: A% U7 {* Q& Q! E
#include <sys/mman.h>- t  Z$ c* W9 k
#include <sys/types.h>% g" @& Q, R0 H. I4 V+ a
#include <fcntl.h>
5 H- p- j0 z& V  X  c/ ~' Q1 E6 N, D2 r' @  y
#define SHAER_RAM_BASE_ADDR    (0x80000000)
3 D8 m7 ?: X  E/ R% h) q5 i#define SHAER_RAM_SIZE         (0x20000)   
& J( y0 e- Z& f  {, Q' F$ S
, H3 K, ?) `6 stypedef struct
, i4 M3 T* M& R0 P6 U" d" @" |# M{
7 d+ _3 l3 e# h9 Q! D0 ]& x        unsigned int a;9 [& I4 y- r" m% R- c7 \' ?
        unsigned int b;
0 J" o4 h  i! A+ Z" n        unsigned int packet_cout;
9 }( l0 v( P  M/ t, w9 b  b}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
# B2 E! L/ Q+ `/ ]2 M+ k! W" n/ N# B1 L3 f& `6 t+ g
void read_MSG_buffer(int *baseaddr);) c! p# D/ K& m
unsigned int count_copy = 0;
7 {# d3 D+ C2 N/ t( a( ]+ x& a# ?2 E% j; B/ |
int main()
: o/ O; |! M  j( N; G+ k! n{7 e: l& i* w: A
        int fd;) }6 h$ X4 c" j1 i4 z2 G7 ]
        int *mem = NULL;
& R5 d3 i, C( g3 v2 N8 L* C( A2 y: U; X
        if((fd = open("/dev/mem", O_RDWR)) <0)
" C4 S7 J, y, U1 I7 M/ z9 ?8 R8 \! t        {0 h8 R. M% M4 z4 o4 u7 T0 F
                perror("open error");" i: a, c/ V0 m$ y7 w( [* b! l1 o
                return -1;
) _# S3 ~' [) Q& U4 L" d        }
7 u6 z0 z+ \- p' O        
: w3 l# M7 _6 f% Q: v" P        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);( k8 P3 t4 N& ^* M) d% n8 f
# i5 |3 ?; C0 U4 B) [
        while(1)
' V1 W5 N$ F; @, `2 d        {$ K2 z/ W2 v5 \/ A! O! [
                read_MSG_buffer(mem);) z9 Y2 c' _, V: q& E
        }                  H( P" U- K: Z5 a/ J# _
}0 R. f, n$ n7 J8 m1 Q" n

; O$ H  L  i; W5 ]& Y! ivoid read_MSG_buffer(int *baseaddr)2 F# w5 ]" P8 v. ^) z* O# {
{
4 Z9 j9 j) c! E        pRX_MSG_PROTOCOL pshreRAM = NULL;5 v% d# ~8 J' u$ q, f/ J8 X0 z

4 e4 c3 E2 V( F: x; P- D8 q        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;# J& N1 j. A/ z1 A) A
: Q4 I8 Q7 }! P) l5 f  v
        if(pshreRAM->packet_cout != count_copy)
/ A" t! _( k! y7 a( Z        {
& i! D% @( A/ F$ [, r$ X9 X) Y8 @                printf("a is %d\n", pshreRAM->a);
" i+ ?, {: p6 L8 M2 B! q                printf("b is %d\n", pshreRAM->b);
9 g: E4 J1 |' O( @( S6 K                printf("count is %d\n", pshreRAM->packet_cout);
7 T# D" W, z+ `& L! `* Z                count_copy = pshreRAM->packet_cout;
% s% N% ]$ P% ?9 k: s1 H        }
" b' T  M. u/ W* J: T$ }        else# }# u7 m: R2 X& W
        {
$ c7 Z4 r% c% j- T                printf("No effective message!\n");
: H4 N" e1 m+ N2 ^3 Z/ [5 `% u$ |        }
- H* y8 A4 h) G& k6 i9 q}; A% ^- ^) G/ t$ x1 [: J* g: P
& ~( V5 B  x0 b. ]7 ^  y
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
/ N& o% m/ I9 ?4 z3 x! u8 z; X% j0 y! ]* w% D

# x6 C, C* B+ S& U- m
2 C" U4 q0 e& @2 r3 s4 Y3 ]
6 Q( _# f5 r( I, ~! |) Q  m6 K* I
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-12 19:14 , Processed in 0.039165 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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