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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
' P) h- P9 r7 V" G: b" \8 w6 _& E/ K1 K
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
. U2 e5 S0 y* ~8 P8 A  W# c, d#include <unistd.h>
. n# K- r8 [9 l1 h' J$ @1 c8 Z% S#include <sys/mman.h>
; T) q2 R# E( `% J1 I#include <sys/types.h>
+ C' u6 ]* U/ @* w9 V#include <fcntl.h>
% y2 q5 l: ]6 }
9 H# Z* q: `" o; Y0 r) I) N#define SHAER_RAM_BASE_ADDR    (0x80000000)   " O  ]: A0 ?6 x8 [) f! t4 v  |4 o9 e0 B

3 z% R+ \" d( Rtypedef struct
; m% k* h2 ]. T* p' |; `0 V{
/ w! z5 t( B8 D' p3 e9 _8 V5 k        unsigned int a;
! y, |; ~' B8 I, K' k% w, }! Z) y        unsigned int b;
/ L: p/ x" K, Q" K7 {2 t" p        unsigned int packet_cout;, y* R+ Y* @$ q5 `; [; k: a
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
* L' T* a' w/ C2 l8 d2 z- W# }* X. a9 t! _' i5 a4 S. Z4 N
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);8 }1 [& k$ h2 B! o' `& P" L3 S! Q- h" x
unsigned int count_copy = 0;
( l* |* W' h) G$ G) j6 H, X6 t/ e. y- V& Z" k7 w- n
6 ?  N8 G- Y1 Y4 @+ d
int main()1 x) [7 ^7 Z6 w# t/ {
{- W$ W( T' [$ F, K& _- x  i/ g
        pRX_MSG_PROTOCOL pshreRAM = NULL;8 f$ \8 ^( O. s. Q9 e1 U; d' U5 F
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
- n) A1 Y# j' f; V5 f
5 B: D0 \9 y' g5 ^6 v! ^7 z        while(1)7 U. V3 N& \3 k/ ^  l. T
        {) R7 g0 \* y" o6 K; T
                read_MSG_buffer(pshreRAM);
( l" d% z5 L( A0 ~% J1 O5 I        }               
+ P9 i6 Q& C/ r" e}  k* E5 N1 [, z

7 R8 t! N6 y6 q$ ]1 v- M( Z+ ~void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
" b1 n# N* `, y! q% Y+ I* L{* i( B9 Z% T4 _! f
        RX_MSG_PROTOCOL buf;
0 [( K. @( D3 I& L        * j3 g  K/ r# k
        buf.a = pshreRAM->a;1 t% T  L/ |. {0 y) v
        buf.b = pshreRAM->b;5 [1 G# `* E* P& \+ m& R
        buf.packet_cout = pshreRAM->packet_cout;
$ k. u; ^- H8 U4 [        
: M+ U0 j9 S  \0 q8 w& X3 m: S' a3 {        if(buf.packet_cout != count_copy)/ T8 Q/ p- x7 `8 Q- p
        {+ [/ a* B- P9 z( }
                printf("a is %d\n", buf.a);6 i7 g' ?* s& S& k4 |. h8 ~+ C
                printf("b is %d\n", buf.b);
; a  k7 f1 ~) U; I$ N- ?                printf("count is %d\n", buf.packet_cout);
9 @. |0 ^3 y0 L$ s" j1 B: {                count_copy = buf.packet_cout;* @6 s2 |5 C3 F  A2 c/ J6 t  G, g
        }& M9 I/ q, ]3 a/ h
        else
. e- a8 |5 p3 `) _# J        {
! R- D8 j" _$ z                printf("No effective message!");# h2 y9 @& X- I8 }0 c5 v
        }2 ~- L/ V/ j2 ?# }
}- f2 X; D, c$ r. s3 ?

, O- B3 \9 A& _/ @& V- X8 M$ q! d* {# }
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。: m4 s8 I; \' W; M: M! |; S
使用下面代码,对内存使用了mmap函数后:  {  \. Q2 X: }% l" Q( A8 {
#include <stdio.h>" h. v1 e5 S, ^# S
#include <unistd.h>
! A1 W0 o4 N! j4 w- h2 c. ?#include <sys/mman.h>) ]0 j' Z1 i2 b, e
#include <sys/types.h>
8 h+ r- Q$ \% O) U#include <fcntl.h>, g& ~  R( S  H

' }  E/ ^' S8 K* _#define SHAER_RAM_BASE_ADDR    (0x80000000); e# \  P1 ^# j" o9 p
#define SHAER_RAM_SIZE         (0x20000)   
" r" @' i, ~/ m& O. E- J  I  W6 Y$ t/ q* X: o
typedef struct
) ~+ ^+ j1 B# w" K5 X{; ?) k' @: s% F) ]8 a
        unsigned int a;
0 p; k2 h" n7 B3 P% W        unsigned int b;5 _2 M4 G2 M' Q% W
        unsigned int packet_cout;
. _4 P/ h  q0 O5 u( [, |}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;2 V* Q+ h! F4 r- c9 g; ^! y6 S$ J# I

% |- }5 b: k. H+ E9 x) H; Y: Zvoid read_MSG_buffer(int *baseaddr);
) b! _1 I4 j% x' Y, ?unsigned int count_copy = 0;
# B5 e  ]' k" t1 L- _3 A
; T6 ~7 ]/ n2 F/ N2 C7 k1 N0 J1 Rint main()
9 @9 |0 v+ A( z& G- x% ]; b2 r{
3 n1 y4 j  Y, L- o        int fd;/ w) w, g1 x8 E7 x* S
        int *mem = NULL;
/ U9 X* i0 P/ }* ]/ \
7 \# Y' [& @& k* y* n" {& ]        if((fd = open("/dev/mem", O_RDWR)) <0)
. b; v5 ]" b& N; S1 ]! t5 s  m6 R& S        {: O) G7 U2 k( m
                perror("open error");! c$ x8 E: a. `) Z/ ?8 d5 b
                return -1;2 A3 S8 j9 A1 E
        }
( b( y0 k( v  Y4 p9 v        
' J9 T. n7 h( ]& S  `4 o7 N' m4 @        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
, s5 w' M: }. w4 K
, W9 j$ W! n0 ?7 i- c+ N        while(1)
. B, s8 E  {( q- q) s0 h        {
" e7 S# Q: o: b5 K" K( A1 t+ a9 V                read_MSG_buffer(mem);) ]% ~% ?% t( Q4 h0 C8 J" H
        }               
. i; y% {3 a# p  ]+ z2 x}" x" f5 w2 H1 P. R4 T$ v1 |
" m* F: g3 n+ l3 Q6 L
void read_MSG_buffer(int *baseaddr)
8 E- S4 u: M' e" f1 A) o3 y- [{+ d1 q* }' W0 q5 a1 M( _
        pRX_MSG_PROTOCOL pshreRAM = NULL;
5 m: k0 [, Q  }! z8 x4 X
6 ]& o' {- ^5 r3 v, o5 u        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;+ k: l6 I' q: r# r

; K8 L* D; m7 a# A        if(pshreRAM->packet_cout != count_copy)* I2 @+ J' O5 O/ o) s9 z
        {
4 S: B' w6 u% u1 Z7 S1 D" O                printf("a is %d\n", pshreRAM->a);
; L& j3 w2 j" x                printf("b is %d\n", pshreRAM->b);
0 F$ N4 `# v. y/ }                printf("count is %d\n", pshreRAM->packet_cout);8 s" I# |! N& [$ n/ u& h
                count_copy = pshreRAM->packet_cout;% U8 V) `7 r$ z: t$ D8 u3 w8 ^
        }
7 [. c7 E) D4 A- j        else3 d5 T  t. _2 M, {
        {4 ~0 G7 D! L/ U4 B/ u- M9 c1 e2 h" }0 @
                printf("No effective message!\n");9 e6 i, X! Z" I2 a
        }
4 R$ C/ `. o0 Y$ D4 R' r" y- L}
+ l' d3 b  l* C- b# m. L+ m6 p, E3 b8 p5 L
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???1 U4 }& k  y! S8 n! S+ t5 y
5 D# X$ L# D- d. f, I

( A# A5 q  U  b" }- ?, L5 l* k
( V  L' Y) n) q* `% d$ X
/ |$ L( \) J+ b
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-4 14:27 , Processed in 0.039952 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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