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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
) g8 T$ g' e" V. ]1 P& a9 e# M* X: F* ]7 L0 n- }
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
( O- x) y  x- v9 {' [#include <unistd.h>+ @/ T, H/ H- [8 h
#include <sys/mman.h>. D% P; _4 H2 p% ~* r+ D: U* v
#include <sys/types.h>
/ C  q8 }/ q% Z! x; p% x4 S+ ^& a#include <fcntl.h>
# }( g% a8 R# h3 x! _" c2 t( a' G% U6 `
#define SHAER_RAM_BASE_ADDR    (0x80000000)   # F) }; H; b9 R# }, D1 N

4 X, w6 V2 C+ K( itypedef struct
  o8 A* w9 k+ G( R% {2 e  r{  t! y" I: m2 K8 r6 B
        unsigned int a;
. Q7 S6 \2 x- ]2 |8 I/ v" [8 ]2 a        unsigned int b;
. `0 y# w- w8 I% P        unsigned int packet_cout;
9 }/ f2 e- e) ~. k0 y}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 @+ ^+ `7 ?) F  W; r
! q3 N4 m. B* V  }void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);. g& m/ h3 w# ^$ L8 b& O1 P
unsigned int count_copy = 0;
. {$ W! _& j+ m4 H
9 V! ~' Y, `, R6 U$ d5 n) G
5 M% m  X' s$ \% ?: [& vint main()
' a% T6 m2 Q, `8 y{
- x$ i2 J7 W& Z! o1 J, h3 O        pRX_MSG_PROTOCOL pshreRAM = NULL;! a' ^/ Y* v% z4 |# |/ {
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
$ x" `- k6 C' |% q. W  h1 |! R0 z; m8 x% {: Q
        while(1)
* h: c8 L3 \+ _. Q, j        {
1 ?7 D3 x1 A2 D8 q/ ^                read_MSG_buffer(pshreRAM);
5 w# P+ {4 M! T$ ]) W" q        }                0 W8 O4 T" Q9 {7 n; a3 @/ Z
}) ~" T, }- V" [/ _
2 g% B4 ~0 Q2 ~& u
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
4 D  n* |2 ?0 I' t{/ `( M) h) ^1 S8 {; D3 Y
        RX_MSG_PROTOCOL buf;% V( F0 @  b/ K! L" I3 M
        
& m  P% v- _1 M% \4 e/ \        buf.a = pshreRAM->a;+ X9 |$ p. K$ K7 G6 _$ B
        buf.b = pshreRAM->b;
" O! n' Y# W( t' L        buf.packet_cout = pshreRAM->packet_cout;
7 v% y* }' S( z. X( g        
% ?, `( o  a6 H  |5 b. _        if(buf.packet_cout != count_copy)& [" L* n3 b0 w. g, A
        {. h3 E: W. y* A/ v' C' ~( r5 c
                printf("a is %d\n", buf.a);8 u0 ~$ j$ b/ F( [% R) }" O
                printf("b is %d\n", buf.b);' l- M# z8 `# b2 T9 c+ @+ c! q- B
                printf("count is %d\n", buf.packet_cout);& n- v: W8 _6 d" ^# j& f. {) z; W  b
                count_copy = buf.packet_cout;
/ G: b" d+ V# O  [  `! y+ b        }$ q, @. h. L+ @. s
        else( p: e" n; T! C# l1 y9 n' l
        {
0 t$ Y  _# S& j5 x5 s( F& C                printf("No effective message!");
) G1 ~, c9 M" j' U        }
. J/ \* ?1 ^; U6 ~2 y' C3 w; B! L}
2 C* E9 e) a0 K( ~2 p$ H- r7 t9 O# W+ `1 [( r. f
8 A) z7 ], d: \+ }. y. b* r: s& W: l
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
. M# s& Y+ r6 x; k" a. f使用下面代码,对内存使用了mmap函数后:
( P" q0 v+ v) ?#include <stdio.h>
1 t# u* l% ^3 Q$ z#include <unistd.h>
( A: n* r2 r7 w; b" w( K#include <sys/mman.h>
# C) g- ~+ ?* k4 y- o#include <sys/types.h>
5 \/ J  P! O4 m) s: j5 B#include <fcntl.h>2 {- Y; L5 L% w+ I. y

+ a# _! L. Q2 v% f( y#define SHAER_RAM_BASE_ADDR    (0x80000000)
( \+ f" K; t" k$ @0 U#define SHAER_RAM_SIZE         (0x20000)   
9 k/ A+ A5 z7 ]* V* `; X  n
8 u$ |8 x9 S% G4 gtypedef struct
- F# Q5 W7 ?# F- d{5 X8 i* K+ j' R8 \; R) m
        unsigned int a;
; L+ L" i0 b# |7 d        unsigned int b;! h8 h8 o: x! c" i! h. [
        unsigned int packet_cout;
+ W4 w9 R# L: y9 H1 L5 [}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;' Z% b2 k! v5 C0 G6 c- o# a4 b  P9 {
$ d0 [0 l& l$ p  p
void read_MSG_buffer(int *baseaddr);. i7 h8 K5 l2 {% K. [' |5 t$ C* V
unsigned int count_copy = 0;( R1 l% U* p, H. q* |: ?. {
7 a+ \7 t; }- D9 j
int main()
7 K* i7 n) O4 E1 D. X& J{4 h5 C9 O  X/ ^2 v6 Y) P3 K
        int fd;
' K$ a- F( m3 O& _7 S        int *mem = NULL;
) J8 M9 o0 v  C, @4 `
  W' a1 Q" k8 P2 W        if((fd = open("/dev/mem", O_RDWR)) <0)5 }0 Y8 N* p0 L# _
        {: l* ]) \$ b3 ^' G
                perror("open error");  n% J+ ], D; V9 {3 ?6 Z" j
                return -1;2 n8 m" [3 R$ R, E# u
        }" b$ Y/ L- p5 b! B$ V- N" |
        9 ]! p7 x0 _4 a" T; E# G6 ~
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);" c' g5 \# R1 w7 z

: w5 P4 G: ~5 m+ Q( X        while(1)
% a# }2 V% O$ |7 |3 E        {
# n0 J) K8 n0 P5 x0 Q                read_MSG_buffer(mem);5 V+ ]' l0 c+ {* ^: b) a# l2 n
        }               
6 {; E  @7 ]! z; v5 M0 N, ^! E9 ^. I}
2 R9 A6 a# s1 J( \" R; S2 e9 y& R; n5 m3 S  W5 j+ c
void read_MSG_buffer(int *baseaddr)5 V1 q  V( N/ ?
{
) Q0 \3 B: t( Z% e        pRX_MSG_PROTOCOL pshreRAM = NULL;& \0 C) x! ~  h; Z+ j+ ]% R
4 V: N/ q- t/ X% X1 U1 g5 I
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
+ a: e, O) f+ i  l5 l
" h6 q& {; e4 E! D% ]# _        if(pshreRAM->packet_cout != count_copy)  A6 b9 ]# X1 S( j0 t  G
        {. v8 T( W4 o# S( S1 Q
                printf("a is %d\n", pshreRAM->a);
) c1 i" g: {6 T! w1 S6 s; e                printf("b is %d\n", pshreRAM->b);( z% y9 V0 w7 d, u8 z  o) ?
                printf("count is %d\n", pshreRAM->packet_cout);% x4 M% x- \' A! Z* ]7 Q) j
                count_copy = pshreRAM->packet_cout;
, P( S1 Z+ R! T1 b        }6 N1 a- J& K3 N: z9 I! G8 y1 K1 j* T
        else( B+ S9 p. Q* i: s# F. ]) l  D1 H
        {: |+ A6 d# i# B/ a2 [
                printf("No effective message!\n");
8 R/ m! c# a% d/ A8 Z* _8 P        }- |" i( i7 I3 A" ~* a( t' O
}& }) K! N: ?8 p8 Z' z$ Z$ q! Y

1 H; K- V; ~% e! z' d: W没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???( P- U- X! u0 C" n4 g

: p# L# ]5 {0 t
; p8 ?; b( p: }9 |
; P* {; X& E: v0 T! X  `5 U7 W  p. R1 ^4 F; I% i. N8 [, J/ W
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-2 12:10 , Processed in 0.041809 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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