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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
. l+ \! G& u' }4 u0 k! c0 H* j' Z1 `  P3 {8 O- q
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
5 L# A# Z* X% _( N& p#include <unistd.h>
7 p) D' C/ J) \2 P$ o#include <sys/mman.h>0 r. k5 m5 j- H5 c
#include <sys/types.h>% M. S8 n+ e( ~$ ]- a
#include <fcntl.h>
( i& Z, `: L8 c3 g
  x6 h) ?3 t1 u# r$ m8 `9 z* r#define SHAER_RAM_BASE_ADDR    (0x80000000)   
) W- `9 m8 v& G* j7 B! |1 H8 l$ {6 h
typedef struct: o% d+ S; D! p! R
{
! k. ~0 C  J" x5 Q" ~. \- s, U! I2 ?% s- ~8 Q        unsigned int a;
" ?- L7 O+ J# V3 Y3 o5 t( N        unsigned int b;
1 x! W7 r9 D) |$ L        unsigned int packet_cout;0 o2 [. U; E; U. B: M2 |2 P
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 u& G, u4 n4 `; Z
$ x* w) K9 j* Bvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
. ~4 h% M  P/ I! E7 }- _/ }9 ?7 a( ?unsigned int count_copy = 0;' N# \0 x  v8 d3 [
- v0 Q. A, \) y* b8 K1 \" ~
- A1 E8 L# C, Z# F/ y
int main()* R% j$ F. U1 ]  y- t
{
- E+ N+ o! G( k( L2 W. ^, C# _- E        pRX_MSG_PROTOCOL pshreRAM = NULL;1 @: |+ d* S  g) n' E% V) v+ o# B' \
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
$ N4 D7 n" a4 V1 b" ]
' _$ J5 F- [3 b9 W% J6 H) t- L        while(1)! \$ V  t* Y* F$ N: A& U; ?! i
        {+ _/ @& V7 Z# p0 J
                read_MSG_buffer(pshreRAM);
1 C7 e9 s  W+ `. {: s+ J! U$ o6 J        }               
1 s# F: k9 o9 q& }& h1 J}; @- r( U; o4 g& [7 q9 g' i
! Y4 g$ K' Q: z9 u, \9 n
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
) _3 I9 i/ a  L5 W* _; w{
# v* M1 `- ^! j9 [        RX_MSG_PROTOCOL buf;
- ?  x4 h; R7 A. m7 X        
/ c9 A. J2 l6 g- u8 o        buf.a = pshreRAM->a;
9 c# J0 p  _2 ~+ [2 ^& B        buf.b = pshreRAM->b;7 E! G5 k4 ]. n1 D
        buf.packet_cout = pshreRAM->packet_cout;6 F: ?8 h, U7 g. M* \
        , v; u4 O9 [7 Y$ y$ M
        if(buf.packet_cout != count_copy)
( S* {6 h; t7 Q4 @6 @: R4 K        {; q. |5 y2 y+ Y) }+ r
                printf("a is %d\n", buf.a);& ^  W( }% Q! t, l2 g( e- x
                printf("b is %d\n", buf.b);: f7 ?" T; V. N8 a* L% Y
                printf("count is %d\n", buf.packet_cout);
4 p( q, C- V8 e# w6 k3 g2 {                count_copy = buf.packet_cout;
/ k: D0 r6 E$ J: D        }/ A. l2 t- Q3 O; C
        else6 g0 P3 b2 G5 t, F: _5 n' g9 ?
        {3 v  e: E% y+ l' }$ e% ~7 B
                printf("No effective message!");
2 A" D1 O3 E4 L# _        }
* Z, I1 V/ C# p! a5 M( k: ], m}. p- M" m2 ~: C/ W" n" t/ K8 |

0 j7 _6 x  W- a: E0 [0 b$ N! Q
$ t7 j  f1 C" M$ c% O但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。/ R$ z: \5 j1 y5 |* x$ c0 l1 j
使用下面代码,对内存使用了mmap函数后:
2 F5 x* h# k+ Q2 F! f#include <stdio.h>3 C* C% K8 ^0 U. _& d" `& K; J
#include <unistd.h>
" B9 ?1 W4 l- [#include <sys/mman.h>: T4 ~7 D/ {6 y4 W, F  k# q; D% X
#include <sys/types.h>
/ u2 ~% V+ A% U! G" w, y% g! e#include <fcntl.h>
" U6 Z# K4 V& b3 g  N# v" g# l3 [$ ?% O9 Y0 O
#define SHAER_RAM_BASE_ADDR    (0x80000000)
% k  r* P5 G( T/ K3 h/ k#define SHAER_RAM_SIZE         (0x20000)   : o( X5 K) D" c& w+ ~! O* d" U5 t

1 B' Q7 l/ v5 c5 B) t& b6 Ftypedef struct
! H, f& Y4 \" y- k{
& x: V+ y# r2 A/ M        unsigned int a;
1 f1 W4 B# X/ u& c7 K7 p        unsigned int b;! p8 t$ U2 P, q% G8 L) @& V" |0 Z
        unsigned int packet_cout;$ g! o. a& O. e% \. c- K: V4 c% h
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 o- m9 Z8 M4 N9 J) w) S. q
3 G) q! K. H3 C* q8 c) Fvoid read_MSG_buffer(int *baseaddr);6 O$ N  J# q( L- F. r
unsigned int count_copy = 0;# ?* p& C, O$ S0 _

( G3 `) Z1 Z7 G3 J) S- Cint main(); A! a' W. ^. Z" r( A5 `  ~- G
{4 R1 F, f, Y- e7 B( y
        int fd;$ ]: s7 N8 n# @; u7 D
        int *mem = NULL;
' a7 J2 [1 Z) w. S9 @
  S: Q' S( t. @" m) D3 ?) G        if((fd = open("/dev/mem", O_RDWR)) <0)* _! O' K2 a1 n1 e4 n0 }  O! N5 N
        {/ k- v" c0 v  U% a4 W/ h, h
                perror("open error");# W0 e" X) t# p% ^4 U/ G. [
                return -1;
' i. w. l' N7 p- u( Y        }
8 F2 ^- K* z/ G& i        
7 _" ^  @( H8 c  @        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
& F' T2 c3 w" ^" j: \* Y$ N+ }# u' V# E
        while(1)  ~& U% |; g6 I, h  F6 y3 ]6 x
        {
* @1 X; x$ h  s; C- Z& Z  H4 x, a  k                read_MSG_buffer(mem);
6 y* u7 Y5 x2 |7 A) d0 x5 A, m        }                3 \+ ~' l. q* _- F4 L
}5 j4 P! q4 h( L8 C. X! q

0 h( M/ ]' d! |' U3 \$ A, L& Jvoid read_MSG_buffer(int *baseaddr)% Z) N1 j; t# e2 b/ f3 e
{
% {* E* ^+ }5 Y0 }1 g: Q) f        pRX_MSG_PROTOCOL pshreRAM = NULL;6 J$ g2 g0 W8 Y' o) {' x

- ^6 B- o9 \- f- X        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;+ ?- b- `* @- L  \6 w7 Q

. y& t. m2 S$ [- J        if(pshreRAM->packet_cout != count_copy)
. F* J2 ^3 u) X8 E% E: P5 I  E        {) G- Q8 h4 k1 d, }' I: K# `3 C/ |
                printf("a is %d\n", pshreRAM->a);  R" q  z6 S1 k# p& X, h
                printf("b is %d\n", pshreRAM->b);( Q8 P0 e6 D$ b' p) u) m
                printf("count is %d\n", pshreRAM->packet_cout);
. h! O" A' q! Z                count_copy = pshreRAM->packet_cout;4 {3 o7 g' |. L- o  D( \
        }
, y, z; j; p% K- q% y( v& W9 _        else$ _) w3 }) B, u- L9 u7 M' ?
        {
6 m% F5 ~% T' {                printf("No effective message!\n");, W0 m: m3 Q% D/ f8 O
        }- ]; n& J% B  T% K. K  d; H
}: _' d: |1 O; O  G8 i3 f( C

/ \8 J1 s- p& e7 F没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???" B+ m  _2 d1 v8 a5 g! l  l. X
( i/ A" n/ c" ?
: z9 Y, ]' D2 B5 p3 v
/ ^+ |9 A# }2 o2 R  B$ J

  F/ G1 n- G" ]6 w5 Y
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-4-7 01:14 , Processed in 0.040408 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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