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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
: U6 M4 B' H3 j* w$ d
/ Z0 C% @0 p9 z: V& MOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
" w* N* U' c) `0 m! l! s#include <unistd.h>
! W+ P3 K# N; `$ A3 S# M: G" q#include <sys/mman.h>0 X- e+ z! Y9 L2 V1 x: ^; A1 u) u4 Z
#include <sys/types.h>
6 c# p$ ]3 G) _8 m8 C#include <fcntl.h>
) h3 C& O/ O7 D7 w8 I3 k
$ u# _9 c+ v( o1 {#define SHAER_RAM_BASE_ADDR    (0x80000000)   
3 d) S  v! H7 {- s8 t
# }0 b4 f  d$ J" s- ~- Q7 J. R9 atypedef struct
, D$ _% u$ p! @, a/ ^{
1 M/ b  }- X1 J% U9 ]1 X        unsigned int a;' M4 }* n: O; M, Y
        unsigned int b;
0 T6 Y# I$ |4 h+ l7 N        unsigned int packet_cout;
1 V9 _5 z2 i' D}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;9 C" T( O9 A" J. A
/ m2 d) Y0 q4 Y: k* _: Q( l
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);, a9 S, h6 l1 q' {' F2 f
unsigned int count_copy = 0;
  h9 r8 k6 @7 z1 A" o/ Z5 @* k1 W7 k
1 p7 n  N# ]4 y) ?# z/ T8 U
int main()3 A# d1 ~+ g8 o9 B, o
{. v' _: i4 w* Y
        pRX_MSG_PROTOCOL pshreRAM = NULL;. F" }$ E% i1 i6 k+ M0 S
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;# ^& v) U8 E; x# ~# |9 K& t9 L
! _, A' e+ ^8 S1 Y6 Y
        while(1)2 C, v" q0 ?2 y  A8 z
        {0 V# c+ j6 S) v
                read_MSG_buffer(pshreRAM);
9 r6 G/ o, d5 Z        }                + G; u2 A, x' z0 w# X$ {" p
}
5 e6 Y$ D/ ?/ B& y1 ]) ^2 o/ X5 \3 ]" R
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)  a% q, r! x; j* d
{
: T& J$ l, W1 Q7 F( y) ~1 d# N8 I# x        RX_MSG_PROTOCOL buf;
5 {% I* V' j; r* G7 U8 w" m        
3 T. @! U: E( n/ v; K) q        buf.a = pshreRAM->a;
& r0 l  s$ Z( @& O        buf.b = pshreRAM->b;
( ]( U# v8 u# d# A7 e* ~8 I; d        buf.packet_cout = pshreRAM->packet_cout;
/ c) \8 {+ M. k3 w5 ~        8 j& l6 C; Y, S0 r+ P, c3 e
        if(buf.packet_cout != count_copy)
2 ?& i6 L! q" J( Q        {  ]) ]- ~# N, i: Q! ^) A& o
                printf("a is %d\n", buf.a);1 g, r7 s# v, ^' M& T4 [
                printf("b is %d\n", buf.b);
1 h: ?& @8 W2 `$ e0 Y                printf("count is %d\n", buf.packet_cout);  p+ J& y/ L7 G! T
                count_copy = buf.packet_cout;
& V9 _7 p& V( B0 V, P        }/ f  v6 c' g  ~) i  s1 N
        else
+ r$ k) ~' h) g        {
; v+ h; W# {5 F                printf("No effective message!");
; l0 q) P4 O" F        }
- q6 j' k" u. P9 c. n5 S7 F}
4 L+ v0 f1 G( `8 O
# Z+ a' d" a& s/ f6 w/ M
2 o3 v) C3 n! e2 u% ?7 d9 T但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
3 i5 M; V3 x0 _' t使用下面代码,对内存使用了mmap函数后:
# q: @* i* t* A2 l2 H3 k#include <stdio.h>
- ~' ^& p+ X, h. w# a: A#include <unistd.h>
  V3 E. w" I( S#include <sys/mman.h>. F- y4 V$ M( W& H% f  R
#include <sys/types.h>
, e2 q" A+ N' _1 w' ]; s- w! O#include <fcntl.h>9 w( p7 g  f- M: \4 a6 Z. [
' |; T' l2 Q' U  I+ P4 p
#define SHAER_RAM_BASE_ADDR    (0x80000000)& D3 `( p" E4 U2 I1 M
#define SHAER_RAM_SIZE         (0x20000)   
( I" U5 P/ A$ N" S! c9 T
% Q+ f5 A6 [& _  W. b0 O' s8 ntypedef struct
' V5 q; ^0 I! T/ C. L4 o( l{
2 H7 L& x  v2 _. w$ a) t5 F        unsigned int a;
3 g9 i1 _6 k# ]        unsigned int b;# B5 X$ P" z: b! W" F( {1 c
        unsigned int packet_cout;* @5 ?+ C/ k& z6 B7 T5 `( b5 U
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
  Z% K- R6 Y' x6 V9 v  ]6 e8 U& k) B7 B4 [: p
void read_MSG_buffer(int *baseaddr);7 {. N( l/ z, T2 W
unsigned int count_copy = 0;
$ B+ @/ i# t/ e- T! G1 J# l2 n& V+ k5 w
int main()
% }; y0 }$ s( v2 z9 j2 J{
3 x3 W/ M* ]) x) p' x/ H        int fd;" Z9 M% Z4 t0 c; ~$ T
        int *mem = NULL;
) i3 W1 m  q3 y
  \9 G. p' ^' ]) b! y& [+ L" t        if((fd = open("/dev/mem", O_RDWR)) <0)
, |5 K% K. z0 _        {
) q. d8 n# c8 L                perror("open error");
, g  k& Q0 o' K" t- A& x  P                return -1;
& W. ]% @. s3 y8 h( n        }
0 c' ^  g' f, W& `7 p' t        
# [  u9 n# E8 C# s  ]9 |        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
' S0 h4 A  t' \4 ~4 D- b* y( w! v2 N
        while(1)
) C  v8 i+ O* }$ j% ?4 O9 J# Q9 z: Y        {
2 U) Z+ {; i$ i  W# I                read_MSG_buffer(mem);
" I. J5 D" \" ?9 \- F1 g        }                ; N0 V  b) c$ w, r6 U0 ~4 z
}7 a/ ]% ?- b) d& E* o3 \$ T

. u% P4 a+ c$ H% @  p% Svoid read_MSG_buffer(int *baseaddr)
3 X5 m3 e* Y) P{- D% ^6 L' A- q2 j) j- ^* u# I6 C
        pRX_MSG_PROTOCOL pshreRAM = NULL;
: O: U- z& l0 q! \: w) |
; o2 E' P: _% ^# P) z! w. S  m        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
  A, |9 k! q+ V' S! V4 G
: l# z$ T& ]1 t- v$ l; M: }        if(pshreRAM->packet_cout != count_copy)+ {0 s% X9 J) o! K
        {) b( w5 E% L9 q+ X. m& a( t3 E7 c# X
                printf("a is %d\n", pshreRAM->a);+ ?6 k6 h7 |1 G, Y0 H" E
                printf("b is %d\n", pshreRAM->b);( d8 A! Z; I, p& f
                printf("count is %d\n", pshreRAM->packet_cout);( t5 I% L. P# g5 E) u0 D# N7 I
                count_copy = pshreRAM->packet_cout;2 H9 Z1 z" C1 _+ }: |* G3 I
        }2 a3 S. @8 B( y
        else
: G& U: w; B# Y0 ~/ N        {/ Q4 |6 M4 R2 J
                printf("No effective message!\n");
$ _) ~. K- e  d  |% ]4 a        }
& d/ {, D. j! @/ R9 ^}- ?; V% |  F; C! ^( u- x+ u

3 X$ g8 f+ B4 u* c+ s) c8 A9 S没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
9 i% _' x, s6 @3 f3 L; g* u( n
+ B- q+ r- z# w" M6 H; E1 M" `, O+ z* f5 D- q5 b

8 z, m; w+ N; v) v+ Z4 u" p- q! A4 x. j# M' d8 L$ L
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-18 07:16 , Processed in 0.040855 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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