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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
  `1 O7 E3 \5 ~* H. W( Q  q" s4 }0 d" q' H
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>, ^5 r) \. y  G5 G' I
#include <unistd.h>
0 @; d5 _3 G0 ~8 ]/ }8 W$ u6 K#include <sys/mman.h>
* ^/ T3 z* I& h2 j6 Z#include <sys/types.h>0 O% h2 s8 y4 X/ Z* ?
#include <fcntl.h>, k& X# \$ Y9 X* O' {
8 @, J3 D, b: }$ ~; E" Z2 a
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
* v5 r) _, Z3 O' S1 a
" Y! @5 g) R- y5 @typedef struct
5 J4 M3 x$ @( s6 _{2 _$ Y. R0 V' p9 ^4 M
        unsigned int a;- H& ]' \9 a( U2 M4 n. I
        unsigned int b;
7 _* ^! t- U# ?! K3 ?2 `% U) a        unsigned int packet_cout;
# j5 o  u: v. Y7 x}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;% p7 l; l! E! q1 T

9 U* E! M, c: Y  y3 Xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
/ H8 f/ p. c: c9 p- g! d4 eunsigned int count_copy = 0;2 X* \0 C$ n( \7 b9 b

1 b/ B0 w. T, p7 f+ t8 V/ N$ J4 `/ n
int main()9 k8 F9 }& n1 P3 @. B
{, E- H! T  S1 _
        pRX_MSG_PROTOCOL pshreRAM = NULL;
9 c/ f' U5 ?. ^8 r. x+ v" h        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
$ a; B' [6 k6 ?8 f/ `' \5 E! G# [: g) i1 f" C3 ]# I7 _
        while(1)
5 S  r( U, _" o        {
3 C% U! h! c* J. t5 L                read_MSG_buffer(pshreRAM);
* i& P( }0 i* U% O& S        }                2 w2 o% I/ [1 O+ L7 O6 `! j+ J
}" U2 l2 B' d* N/ ]2 |! ^1 i0 v- p
* x+ ]4 x# c" s8 K: o( h
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM). H; Y5 _4 }. c7 @
{
5 v2 X  y- V% }        RX_MSG_PROTOCOL buf;
, U5 c9 T$ Y! e7 O  _& p        & W$ }  D# U/ E4 g1 g) o
        buf.a = pshreRAM->a;2 {7 Q; m2 Z, G& A, I. M
        buf.b = pshreRAM->b;$ Y: {/ n. N4 `6 I3 `/ S
        buf.packet_cout = pshreRAM->packet_cout;
' r, X5 p# I! c        
4 o8 q& J8 {2 _; K  l        if(buf.packet_cout != count_copy)
, G6 E# l: F9 l        {
1 Q- K% ~$ k7 K                printf("a is %d\n", buf.a);5 g; ~  E4 W$ G; [1 @7 c# S* c
                printf("b is %d\n", buf.b);! m3 L* L! X5 g' H
                printf("count is %d\n", buf.packet_cout);
5 _* j" ?& h- Y5 F( K                count_copy = buf.packet_cout;; z  M# A; `& w& f3 I" d: R% w
        }
+ |7 O# R  p( a) s" M0 }- o        else  @. g$ D0 f. ^: b
        {
  Y7 |7 O. V$ x/ }7 L' M                printf("No effective message!");# [7 K* j5 \$ o& d' R4 I
        }* D7 |2 m+ v7 q: t& ~' H' `
}  P/ E7 M% E" N, i/ [; b# |# N

5 I" U6 ~- u+ g! Q' Q* D; m& o% \3 H& m& d
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
/ P) z5 t6 e- o7 M) L使用下面代码,对内存使用了mmap函数后:
( L0 g* ^1 r- N! m" i+ ?' }#include <stdio.h>1 R! ]6 A# N& U" Z" e
#include <unistd.h>
$ i( |4 H, Z( T' m7 i#include <sys/mman.h>
  w* }% l9 I1 M. s; ?#include <sys/types.h>% I1 d/ G6 C" V8 m1 m2 P3 \1 D: j3 G
#include <fcntl.h>7 f7 \* X2 Y5 G1 _7 u/ E5 @9 z

- ~, ?2 }1 K; Y#define SHAER_RAM_BASE_ADDR    (0x80000000)+ P$ r! a9 N4 Y, y1 W
#define SHAER_RAM_SIZE         (0x20000)   ( l: q" R, Q) Y; i0 D5 n
7 A" M) F2 |% e' y- R' E0 ^* U4 \
typedef struct
2 c$ z! W$ N; P) D1 m{  ^/ i1 W: ~: |) M$ N6 ]8 X1 }# Y
        unsigned int a;
, |  o* A6 J- R% o) r$ B& T6 F        unsigned int b;" e- w1 v: o5 {: ~
        unsigned int packet_cout;
5 A# R" V: ^2 i% f6 z, y" ^}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;; b  }& H5 O9 L  \
4 L; \6 k* P9 j6 |" f# K
void read_MSG_buffer(int *baseaddr);/ ~8 V4 S; [' E. u7 E
unsigned int count_copy = 0;
" a/ ^0 e- Z" n( l$ }/ ]* O0 d
8 V% u: @; n4 G& t2 Xint main()
7 y0 k$ n+ {& @4 {{' P& E, f' G" y' D* T
        int fd;
! P* G$ C$ h0 D# N" D" _! }        int *mem = NULL;
% _# m2 h1 @1 W" g. c+ ]; x/ U- g3 @% }' G5 d  Y) r
        if((fd = open("/dev/mem", O_RDWR)) <0)2 q1 H+ z* R, q) C9 u
        {
5 n3 ]2 r2 j8 X0 d5 M( s: g) N                perror("open error");
( ?5 V6 O1 h3 J0 m                return -1;/ w* L, _8 C! ?0 F
        }1 S, X+ W) L- |: V0 z8 W4 B8 R9 I  W
        
$ C. R% J5 T" ~; {6 ~4 w) u" [, [        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
1 ]6 V$ T7 w7 u% J! c# r  z+ o/ m0 X
        while(1)( h! P9 S7 M+ ], N, s/ @  N- X9 m% H5 I
        {0 w% |  [2 V4 n( [; R+ \5 q
                read_MSG_buffer(mem);
% }, ~7 a& f+ C1 B        }               
3 S5 v4 @3 _* ?. }" X" ]}9 f% d- N. c5 e% O" J* J" B

) W# n2 r8 d$ O1 u4 N) ]void read_MSG_buffer(int *baseaddr)
$ s0 l# M( P) h0 |{9 z) H! N) E( [1 Z  }0 P4 M1 }( d
        pRX_MSG_PROTOCOL pshreRAM = NULL;8 A; t/ P; i/ r& W) m
/ S; f- p, p. y9 N- T& h% U
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
9 k2 ~0 X( B8 f) o5 c" G% d7 a( q. X$ A( V
        if(pshreRAM->packet_cout != count_copy)0 `  B$ D& N, }' W  A
        {6 g0 s% B+ _. O; o5 Z) \/ H% b
                printf("a is %d\n", pshreRAM->a);, G' c+ L( j( C0 a5 v: E
                printf("b is %d\n", pshreRAM->b);
7 ]1 w& [- _' J# [2 J                printf("count is %d\n", pshreRAM->packet_cout);3 J( d/ H8 @8 g% C
                count_copy = pshreRAM->packet_cout;
& D! q2 r; q1 l, j        }
0 x3 R3 }4 w3 z7 H$ i        else7 D& Q* h. g- o
        {
, Q: ]& \4 e' a2 a+ V4 ]                printf("No effective message!\n");" }6 N& \) E, K2 F
        }
4 k8 j# J! I6 G! T4 N}* y  D; z, O9 [/ m( j3 I% _
5 o& x" i: Z& c  K1 \) q: o4 b# b
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
6 h2 d6 j6 l8 U# L$ ]! @5 C
6 p& ]+ {) U  z8 M0 O2 t" l* N1 X3 Z" X2 O) d

  C1 r0 J# e6 j) p* M  g+ M  s$ Z' N: r, V4 y7 S
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-17 11:44 , Processed in 0.039549 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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